Hacker News new | ask | show | jobs
by dqdo 4152 days ago
I worked at 2 start-ups so here are the technology stacks:

The first company was started 3 years ago and our technology included: (1) Python-Flask (2) Postgresql (3) SQL Alchemy (4) JQuery for web (5) Objective C for IOS (6) Bootstrap

In my second company we wanted to take advantage of the growing ecosystem around Node. We also did not want to have to manage a DB, migrations, and server scripts. Our rationale is that we should focus more on the customer and turning the customer requirements into the product than on the technology working. We are an enterprise software company and so the less complicated the technology the better since we are not doing anything ground breaking from a technology standpoint. Our stack includes: (1) NodeJS/Express (2) Heroku (3) Angular JS (I don't get all the negative comments about Angular lately because it works fine for us) (4) Lodash (Javascript utilities) (5) S3 - static file storage (images and files) (6) Jquery (7) Bootstrap (8) Firebase (9) Angular Fire (to connect firebase with angular)

Using our current backend, we were able to build the SAAS product in about 1 month with only myself as a developer instead of 2-4 months that might be required if we had used the previous technology stack. Firebase, Angular, and the Node ecosystem really helped make the coding much faster than before.

2 comments

In my opinion, web technology has become so advanced that the technology for the most part should not matter as much. Unless you are doing something on the scale of Facebook or Google, your technology usually does not matter. Just choose the stack that you are most productive with. And some are more productive than others.

When choosing a technology stack I look to Southwest Airlines for inspiration. I might sound strange but more people should embrace the Southwest model. As an airline, they only have 1 type of plane and tries to keep things as simple as possible. So instead of building some of your products in Ruby, other parts in Python, and another part in Erlang; it is better to just stick with one or two core technology. The rationale behind this is to reduce context switching, reduce errors and bugs that occurs at the crack of technology systems, make it easy to train and onboard other people to your project, and make it easier for yourself to maintain it over the long run. My rule of thumb is that software is maintained and read more often than it is written so now I tend to take much longer to write software because I have to think about how people would read it. For every 2 days of coding, I spend about 1 day of refractoring and I do this religiously to keep the technical debt low.

I have recently been going the other direction from the "Southwest model".

It's on a case by case basis, but if it takes less time to learn and use a technology that is purpose built then I'll invest the time to learn / use something new. I find for some situations it's less time and effort to use the right tool for the job vs. trying to make one tool do everything.

So I by no means am talking about following the Southwest model religiously. There is always a tradeoff between over using a tool and having too many different tools in place. Ultimately you have to choose the right tool for the job. But more often than not, people tend to choose the trendy tools because they sound cool. Leave the experimentation to side projects where there is less risk involved and the codebase does not need to be maintained for years.

My general philosophy about software development is to keep things as clean and simple as possible -- and no simpler because then you wouldn't be solving the problem in the first place. So I am not suggestion that you over use (for example Jquery) to do everything in the web. What I am suggesting is to think about building software the same way that we build houses. You want to choose carefully the tools that will stand the test of time and not just the fad language or tools. For this I usually check out the community behind the software.

When I architect a software solution one of the parameters that I think about is how long will it take to get someone totally new to my technology stack up and running (and hopefully productive). Most people don't think about this deliberately and so a project might have legacy code that takes months for a new person to come to grip with. Imagine trying to recruit for this type of role. My general rule of thumb is to have the choice of tools/modules as standard as possible and aim for a 2 week preparation period for anyone to get acquainted with the code. For this reason when I use ExpressJS I stick with EJS rather than Jade. I still use CSS rather than Less or Sass (these are my personal opinion).

I also take this philosophy a step further by creating certain software patterns and try as many of the well tested patterns as possible. Thing brings consistency to the codebase.

One place where I am often tempted to break the Southwest model is using Rails for an app server and Python for machine learning. I really believe Rails is a better choice for quickly building and adapting web applications, but Python beats Ruby hands down for ML work, both exploratory and in production. If I knew I was building an ML-heavy application right from the start I'd probably use Python for everything, but more often I find places where an existing Rails project could benefit by adding an ML component. Webdev and ML are easy to segregate, architecturally and personnel-wise, so I don't think the impact of using both is too bad, but I'm curious what others think about this. Does anyone else use both languages together? If so, what is the size of your staff?
Sounds like great advice to me. I'm looking at different stacks and approaches now and coming to the same conclusion about using a single technology to reduce the context switching and simplify everything. The idea of taking time to write software for maintenance sounds great to me.
Southwest is a great example but lifespan of airliner models and software vary a lot. How about 80/20? Stick with one/two technologies for 80 percent and have 20 percent room to try out new things.
I tend to decide which tools to use base on how likely I would need to maintain and refractor the code. For the core application code, I want to keep things as nice and simple as possible. For particular functionalities where once you build it, you really don't have to change things I tend to use the right tool for the job. I also try to isolate the code in a way where if I am using a unique tool or unique coding pattern, I would cluster those type of code together. This allows me to isolate the unique areas in the codebase quickly and make modifications when required. Using this strategy you can use the esoteric solution in the right case and still be shielded by the technical debt that it might bring to the project.
Thank you - that makes a lot of sense.
This.
I see a trend here, I'm also solving most cases with no-backend solutions. In your opinion, what would be the downside of Firebase? Did you have to work-around any limitation? Also, did you try Backbonejs as well? Can you compare it to Angularjs? I am thinking about giving Angularjs a go but would like an opinion from someone who's already using it in prod.
There are two downsides to Firebase. The first one being price. For certain applications (e.g., photo sharing app) it does not make sense to use Firebase due to the high cost of storage. I would just use AWS in this case. The second downside is that it takes longer to run SQL-like search queries on the data. Depending upon your application, this might be important and Firebase does not do this well. What Firebase is good at is make the development process very quick and for real-time applications the set-up is much simpler than web-sockets.

I have tried both Backbone JS and Angular JS and in my opinion, I like Angular's separation between the front-end html and the model. Reading through Angular is much faster than reading through Backbone code because Angular is very opinionated. I like opinionated frameworks and languages (e.g., Python) because if there is only one right way to do something, it simplifies the code greatly. Some people don't like Angular due this structured approach and opt for Backbone. As for performance, there really hasn't been any problems with Angular and Firebase. I am not sure where the complaints about performance comes from.

And just one last comment. I augment AngularJS with Jquery and Lodash. For some functionalities, I like to work directly in Jquery or Javascript rather than use the Angular method. I find this much simpler than stick 100% with Angular and in order to keep this logic clean, I keep the Angular and Jquery code separate.