What is your current stack?
I am looking for what to pick up next, and would like to see what you are currently using for your web framework/language. 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. 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. I am using openresty,couchdb and jquery. Openresty because it so much fun :) It uses lua which is a very pleasant language to work with (I love the idea of multiple return values from functions) and it built on top of nginx which is a big win for me since I always use nginx in front of my app server. With openresty I can use nginx both as an app server and as a proxy. I think that if anyone is already using nginx they should look into openresty because it opens up so many possibilities. couchdb because of it's ease of use. It has a simple http api that works well with openresty's `location.capture/capture_multi` capabilities. It has a server side javascript environment which can be used to validate data/render templates etc,the common js module system is very capable. It also gives me an excuse to have erlang in my stack, ready just in case. jquery because it is reliable. The other javascript framework that I like is knockout js but I use it only when I need to have a complex client side logic and knockout js works well with jquery. If I do my own REST back-end: node/express or good old php. If I go no-backend: parse.com or firebase.com (different use cases). Front-end: BackboneJS and the usual mix (CSS, HTML5, Bootstrap, Jquery, etc) and I am looking into adding ReactJS to the stack. Increasingly I am using more free/paid SAAS for services like file uploads, emails, storage, monitoring, etc. Not sure if we can call this approach a "stack" but surely it is becoming very relevant and it solves most requests I get. I guess it is also interesting to rapidly hack an MVP with such tools and if the thing picks up (traffic/user base) you can scale the services (pay more) or start programming them yourself, if the think flunks time/money was not wasted. It is also a big plus that these services play super nice with mobile native and mobile web, SDKs are always available. Maybe I am a wishful thinking hipster but somehow I feel this is the trend to follow. > Increasingly I am using more free/paid SAAS for services like file uploads, emails, storage, monitoring, etc. Yes! I forgot to mention this in my answer. For prototyping, Parse is great. I recently built something in an hour that would've taken me a day in the past. When I get past the prototype, RDS, S3, and Dploy.io are also huge time-savers. I surely will check out dploy.io, I was uploading static sites to AWS S3 through the AWS Console :( There are actually a lot of solutions (cloud-based, as well as local/terminal-based) for this. I can't say that Dploy.io is the best, because I haven't used many others. I will say that it's "good enough" for me -- provides web hooks and allows rollback. > Increasingly I am using more free/paid SAAS for services like file uploads, emails, storage, monitoring, etc. I'd consider this part of the stack -- it's just not done in-house. Can you list the services that you'd reccomend for those tasks? While I've tested a lot, these are the ones that I actually use in prod:
- AWS S3 for static storage + Route 53 for static websites
- Ink (Filepicker) and Ospry.io for uploads
- Parse.com for persistence and user management
- Firebase.com also for persistence but for cases where auto-synch is required.
- Madrill for transactional email
- Newrelic for monitoring
- DigitalOcean for cloud hosting Languages: Ruby / Clojure / JS Frameworks: Rails / AngularJS / Cordova DB: Postgres / Redis / Elasticsearch / Memcached / DynamoDB Messaging: SQS Plan on learning in the next few months: More Clojure Machine Learning ReactJS (Hopefully a replacement for AngularJS / Cordova from above) I've been picking things to learn based on reading programming books and observing trends. 7 concurrency models in 7 weeks, 7 languages in 7 weeks, and 7 databases in 7 weeks are all good places to start for finding something new to learn. As you can tell, I'm a big fan of the series as an introduction to a topic that can then be explored in more depth after reading. Depending on the frontend, I use either PHP or Node. Python is a better language and more enjoyable to code in, but I often pass my projects on to junior devs to maintain. It's a lot harder to find someone to take over a Python project than a PHP or JavaScript one. All the good Python devs seem to be gobbled up by larger companies. I'm getting into Go now, but I'm hopeful Rust will become the language of the future. I'm desperate for a great type system in a web framework. Elixir is cool, but I don't think I could find anyone to work on it for me. > Elixir is cool, but I don't think I could find anyone to work on it for me. You would be surprised! The Elixir community is growing quite fast. Come hang out on IRC in #elixir-lang on freenode sometime. Elixir also has the added bonus of the entire community more or less accepting Phoenix as the "go to" Web framework so Elixir doesn't have nearly the amount of web framework fragmentation of Go or Node. Languages: C# / JS
Frameworks: .NET / AngularJS / jQuery
Database: SQL Server or SQLite if needed for a tiny system
Tools: TeamCity / Octopus Nothing too fancy on my end. I build standard CMS based websites at my day job using ASP.NET MVC. At home, I occasionally work with Django, but with all the news about .NET support across Linux I've put Python down and have been toying with writing C# on my Ubuntu box. My current stack: - Server: Node & express - DB: Mongo (using mongoose) - Frontend: Knockout.js using components (introduced in 3.2), Cordova when developing mobile. - Hosting (db, services): Azure Pretty standard with the exception of Knockout.js, which I think is criminally underrated following the introduction of components in 3.2, especially given all the recent hype around component/module based separation of concerns. Also Azure, mostly because I get $150 free monthly from MSDN. knockoutjs is something i loved to code. Althgh its long time now when I had a look. Does that still fire all bindings together? If it's been a long time, you should definitely take a look again at components, which really feel like the thing knockout has always been missing. All bindings are still fired upon applyBindings, but I haven't encountered issues here - it's still once on page load, and I can't imagine that it's much different than building the DOM initially using handlebars or react. I would surely make time for KnockoutJS. But currently I have been following flux which is quite easy to implement althgh I am still not sure how it works with routing, 3rd party libs like some charts etc. At work it is Scala with Spray, that is becoming now Akka Http. In Spray you have to write your our implementation / helpers for many things as Spray is quite minimal. Scala gives your type-safety, but sometimes it feels like too much typing (say, for prototype app). So for hobby projects I started to look at Clojure / Luminous and Elixir / Phoenix. I have joined a few startups and architected a few as well. I currently love one of the following two stacks, depending on the need: GoLang -> Postgres -> React
Meteor -> MongoDB -> Blaze Of course, most of those are interchangeable. We use Redis for caching, Docker/Ansible for deploy, etc. Golang + Gorilla, running the built in Golang net/http web server on a Linode VPS. Frontend is just HTML/JS/CSS with assorted JS libraries like jQuery and Bootstrap. I use this for several side projects. My current development stack: ( During my day job )
Front-End: AngularJS
BackEnd: ROR
Database: Postgress ( For my side projects )
Android Development
ROR
Redis/Postgress/freebase and lots of reading about Material Design Plain ol' LAMP stack here (with some extra goodies thrown in - memcache, varnish, redis). You should use what you're most productive with, not the new, shiny thing of the day. Meteor. It's a fun, fast and modern web framework that uses javascript on both the server and client so it's easy to pick up if you already have web skills. I've tried Meteor with a side project. I did manage to develop fast and the initial performance is ok. However I found the Meteor server runs slower n slower. I'm not sure why. I just assume it might have some traps or catches that I don't thoroughly understand. Java - server side / GWT - client side. Interesting. We used to use GWT for several projects, but ditched for new ones to simple Java backend and AngularJS.
Now when I had to fix some bugs, etc it feels so unpleasant to work and kinda slow (for dev). Project still uses old GWT 2.5 since transition to new version & 3th party component replacement would cost too much. Do you use modern super dev mode and latest GWT version? How this turned out? Are there 3th party plugins repository? > Interesting. We used to use GWT for several projects, but ditched for new ones to simple Java backend and AngularJS. We would love to use lighter-weight technology but project currently is about 300kloc and we share code on the client and the server. It's just not the size of application which JS is good for. > Do you use modern super dev mode and latest GWT version? How this turned out? Are there 3th party plugins repository? These are great. In 2.7 you can just refresh page and incremental compilation will do the job. It's almost like writing code in JS. Angular, C#, Oracle, SQLServer is the legacy system. Angular, Clojure, CouchDB is the new one. Python / Django / Postgres / jQuery Currently trying to learn iOS development with Swift. The most recent web work I've done was Haskell/Yesod. Is it commercial project or hobby project? Non-profit. snowdrift.coop If it is personal, where do you host? Python, Django, Postgres, Jquery spring boot + mybatis in backend, ZK in frontend, it's for an company ERP extension app