- Make a simple website. This will teach you how to handle routes, serve files, using best practices and other http 101 stuff
- Make a more advanced server with database connectivity[1]. This will show you how different languages handle database connectivity, database design, sessions, ORM and other webserver stuff.
- Now make the same website using a framework. Eg: express for nodejs, flask for python and so on. I don't recommend using bigger frameworks like RoR or Django at this point. This will teach you what makes the language's ecosystem tick[2]. It will also show you how frameworks help you build websites faster.
- The last step will be to use a CMS on the language of your choice. This will teach you how to deploy apps on the cloud, webserver, etc. At this point you know the internals of how (almost)everything under the CMS is working and you should be pretty confident in building a custom website all by yourself.
Notes:
[1] You ideally should be database agnostic but use whatever database the programming environment imposes upon you. For example, use mongodb when programming in nodejs. Once you work out the kinks of using a database, you can use other databases like rethinkdb, mysql, etc.
[2] Large frameworks are opinionated and impose their own ORM, app wrappers, terminology, etc. Use a small easy to learn framework like flask for python, slim for php, etc and then move on to the bigger frameworks.
First, if you are building a web site you might want to really have in the world, then as a bonus you have it! (Think portfolio, or a blog that actually belongs to you...)
Second, if you do this for more than one language you will have a basis of comparison, and this will be valuable to you in and of itself. It might even be valuable to other people! And maybe a topic for the web site....
Third, if you don't want to deal with the inevitable combination of HTML, CSS and Javascript (and various templates, frameworks, etc) that go into making a real website, then consider making an HTTP API instead. You'll still learn a lot, but it'll be more focused.
Finally, you might find you have a particular thing you want to do differently than you see it commonly done. Web sites, web frameworks, and API's are great places to scratch that itch.
However, be wary of rabbit holes. I'm currently in the middle of writing the web thing I wanted to have "just so," in its second form in Go, having already built it twice in Perl and once in NodeJS, and I think I'm on the right track right now but at this point who knows.
(I've learned a lot of Go this way, but this is not an efficient way to actually create software.)
https://docs.google.com/document/d/1TyqD2_oDtiQIh_Y55J5RfeA9...
https://github.com/karan/Projects
http://www.dreamincode.net/forums/topic/78802-martyr2s-mega-...
As a personally embarrassing example, I once returned to Python after three years of heavy Scheme usage. I spent a week porting an almost trivial application and it felt like Python was fighting me every step of the way. Had I not had past pleasant practice with Python, I would have abandoned the language as useless.
Finally, at the end of the week. I realised that I was trying to write Scheme in Python, which work about as well as writing Python in Scheme. Python has for loop and I should be using them.
About twenty minutes later, the app was ported. It wasn't my finest hour.
We took an app written and maintained for the last 10 years in language A, and re-wrote it from scratch in language B.
The new codebase is smaller, more maintainable, and runs faster!!!Almost everything I have picked up by myself over past few years has been this way. Golang (frustration with concurrency in Python), JavaScript/React/Redux (frustration with "native" GUI frameworks), Android SDK (Speed, sensors pre-html5-webview), GraphViz (frustration with "project management") etc.
· Lisp interpreter
· Lexer generator
· Knuth's Pac-Land
· Linear Algebra library
· Workflow engine
· m-ary tree
· Now Do This app
· Project Scaffolding generator
· Gap buffer
The basic idea is:
1. read a file containing a list of sample names, one name per line
2 convert each name into a sequence of triplets; as an example, 'Fred' becomes the list ['Fre', 'red']
3 choose a random starting triplet
4. choose a random non-starting triplet that matches the start. A triplet matches the previous choice when the last two letters of the previous one are the same as the first two of the next. Repeat with the new triplet as the start.
5. When you reach and end triplet or the length exceeds some limit, stop and merge the triplet. Merging the sequence means merging them two at a time left-to-right. Merging two triplets means dropping the first two letters of the one on the right and tacking the remaining letter onto the one on the left.
Besides being easy and kind of useful for learning languages, it's also kind of fun. With the right input lists the names generated can be pretty funny.
'Corichadwinardo'
'Tadforgio'
http://vikaslalwani.com/projects/
All the source is available on GitHub and I am sure you will have lot of fun creating these :) Feel free to contact me if you need any help.
I.e. why do you want to build project $foo or learn paradigm $bar? To make web apps? To get great at Project Euler and Code Jam? To expand your mind from a theoretical POV? To get hired at in finance to trade securities?
CS hasn't gotten has large as other fields but it's pretty expansive. A little more concrete information as to what you desire your endpoint to be will help us a lot. Otherwise, one might ramble on for half a thousand words on compiler theory when you really want to target FPGAs.
Edit: Dr Matt Might just blogged about PL's[1]; pretty relevant to you, OP. Post-read, definitely the information you're looking for. Scheme and Haskell (or really, any H-M type inference based language... you don't need to commit to typeclasses and pure functional idiomatic lenses over, say, OCaml's modules and semi-purity to 'reach enlightenment'...though perhaps them be fightin' words around here ;) ) If you liked pre-relativistic mechanics, SICM is a funner text than SICP (contentious remark #2 ! I'm just lookin' for a nerd fight now!). Both are well-written texts accessible to most anyone (i.e., don't be scared, the furthest they go into is perturbation theory)
If, on the other hand, you're interested in enlightenment, academic research or a start-up, the criterion by which you should choose your next language is not employability, but expressiveness...Here you'll find descriptions of four good languages to learn--Haskell, Scala, ML and Scheme--with a list of my favorite features for each, and pointers on where to learn more.
[1] http://matt.might.net/articles/best-programming-languages/ I'll forgive him for this URL slug since the caliber of his content is significantly above average.
It's always nice to see visuals appear (in a file or on screen). It's like a compliment for the work done.
And you will learn a lot of basic stuff like loops, scope, types, and so on.
That and glancing at the AST if the language is open source.
Whats truly great is that you are forced to solve the problem on your own, and then you can see how others did it, both in your chosen language(assuming it's a somewhat common language), but also a myriad of other languages.
1. hello world (simply getting something on the screen)
2. todo list (display a simple data-set and interact with it)
3. blog (display a relational data-set and interact with it, maybe some auth stuff)
But I would like to know how these steps would look for embedded stuff.
1. Make a LED blink - the Hello World of embedded.
2. Output a PWM signal from a pin to control a motor or to a speaker output.
3. Read an analog signal using the onboard ADC. A temperature or luminosity sensor is a good start.
4. Write a light OS that can execute multiple tasks simultaneously - take user input, read analog sensor values, perform a calculation, keep track of time, etc. This will need all of the above + interrupt handling.
I already imagined that the hello world of embedded is a blinking LED , haha.
So these things (PWM, ADC) are "standard" to all embedded systems?
Not really. PWM is more common (and "can" be done in SW or using other tricks if needed)
This[1] is a great place to start. I keep on meaning to write a 'hardware for CS guys' guide, that'll suffice for now.
[1] http://umassamherstm5.org/tech-tutorials/pic32-tutorials/pic...
AVR for controlling and PIC for computing.
What projects are perfect for learning Erlang (which might involve both the functional and concurrent aspects of the language)?
I guess what you're looking is the general skill of being able to model things with a programming paradigm.
Found that as a pretty good little first step.
At some point you will put these behind you, use pre-written libraries and graduate to an application.
Are you saying to compile the source of the compiler, or write a compiler for that language (in that language)
This way you'll quickly understand the semantics of the language and will get an early exposure to its dark corners.