Which projects use LLVM?

Turns out LLVM keeps this list at http://llvm.org/ProjectsWithLLVM.

Some of the better-known entries on the list:
Rubinus: http://github.com/evanphx/rubinius
Unladen Swallow: http://code.google.com/p/unladen…
Clang: http://clang.llvm.org
DragonEgg: http://dragonegg.llvm.org ("a GCC plugin which replaces the bulk of GCC's optimization and code-generation system with the LLVM implementation", according to http://lwn.net/Articles/383201).

What's the best way for a beginner to start learning Ruby on Rails?

Computer programming is something that you learn by doing.  To learn a programming language you need to use it.  In this case we're talking about ruby, but it applies to all programing languages.

After going through a few of the tutorials mentioned elsewhere on this page you will probably feel like you're comfortable following tutorials, but that you don't feel like "you know ruby". 

And you never will feel like you've truly learned the language until you start venturing out and using it without the hand-holding that most tutorials provide.

Here is what you need to do to actually learn ruby.

So shortly after completing a few tutorials, the approach you should take is the same approach that Japanese martial arts masters use to master their craft: kata.


If you're looking to become a Rex-Kwon-Do master, you'll practice reacting in response to a specific move an opponent makes with a certain choreographed patterns of movements until it becomes muscle memory.  You'll want to do the same with coding challenges.

So from various tutorials you'll learn what different commands you can write.  When you face your first problems it's common to feel overwhelmed.  There is SO MUCH stuff in that this ruby programming language has to offer.  Should you use an each command or a return one?

The nice thing about programming is that it is possible to solve all computing problems with a remarkably small number of commands – by mastering a relatively few commands you can glue them together to solve all your problems.  Once you master the most important commands of the programming language – you can work on some of the other "cosmetic" commands, which might allow you to solve a problem with 1 line of code instead of 3.

The master has encountered every single variation of every problem countless times and immediately has the muscle memory of how to solve the problem.  It's a reaction without even needing to think.

A beginner doesn't have these coding instincts.  To develop them, but you can develop them using kata.

Kata in programming are coding challenges that will push you towards using a small number of specific pieces of the programming language at your disposal to give you this muscle memory.

Here's an example of a programming kata.

Reverse a sentence, for example the turn the text "bob likes dogs" into the text "dogs likes bob"

This is a relatively simple problem, but it will require that you know how to do the following steps:

  • Covert text into a list of words
  • Reverse a list of words
  • Recombine the words together into a sentence

And the first kata you get will kick your ass! It may take you an hour or more and you might not be able to solve the problem.  You'll struggle and the process will feel frustrated.

And eventually you might give up and ask for help.  But then when you look at the code that solves the problem, you'll understand how and why it's working.  By fully understanding the solution to each kata before moving on to the next you'll start developing this mastery of the craft.

You'll appreciate what each piece of the program is doing and be better prepare for next time, when you'll have a different, but similar problem.

And then when you tackle your next programming kata, for example:

Remove the word "likes" from a sentence, for example turn the text "bob likes dogs" into "bob dogs".

This is a problem that has similar steps as the previous problem:

  • Convert text into a list of words
  • Remove one word from the list
  • Recombine the words together into a sentence

This second kata shares a lot of commonalities with the first one (it's 2/3's the same as the previous problem!).  So by fully understanding how the previous program works, you'll be able to do something similar for this problem.  You can re-use a lot of the same steps.

The key is to continue working through harder and harder challenges.  After you solve a number of different programming challenges without instructions of exactly what to type you'll realize that problems that used to challenge you are now really easy for you to solve.

And when you finally start solving the problems it will feel so satisfying and fulfilling to conquer such a hard challenge.

If you're looking to land a job as a web developer, you'll notice that on the technical interview process you'll be given kata to test your ability as a programmer.

The kata you'll be given as part of an interview test will probably be a lot harder than the ones that you're starting out with, but you need to work your way up to this level of question slowly.

Tools like tryruby and RubyMonk can give you a 360° view of the ruby programming language.  Learn Ruby The Hard Way is a good overview and I'd suggest completing the study-drills they have as well (the study-drills are kata at a timely fashion!).

From there, to take your ruby-fu to the next level, solve problems from sites like CodeWars and excercism.io.  Codewars in particular is super cool because you can review solutions other people have written.  Some people will use cool tricks on their solutions and you can learn from them.

Finally CodeAbbey has some really complicated challenges, which will help you really master the language.
 
Before you know it, you'll know exactly when it's the right time to: Sweep the Leg, Johnny.

[As a side-note this is a slightly different answer than How do I learn Web Development? which is a related question, since ruby is often used in Web Development]
 

I also can suggest going through the Intro course I've setup for my online coding bootcamp, Firehose.  It's free and takes most people around 2 weeks to complete it. It's is a combination of instruction and coding challenges and whether you're looking to sign up for a coding bootcamp or not I think most people learn a lot from it.

Firehose Intro to Web Development Course – 2 Weeks Free

If you liked my answer, it would mean a lot to me if you upvoted it, by pressing the light blue button below.

Where can I find a fast and memory efficient skip list implementation in C or C++?

I just happened to implement one and released it on GitHub.

Here is my blog post about it: http://kofif.tumblr.com/post/901…

Feel free to use it, fork it and contribute to it and really do anything you want with it.

I am still working on improving it, adding iteration, etc., but it is definitely ready for use.

Is there a correlation between programming language appeal and educational/programming background?

I wonder if there's the exotic other effect here. I am an industry programmer and I like languages which have wide industrial use (OCaml, Scala, Lisps, C) but (at least for three of them) are still considered academic.

 On the other hand, I know lots of academics who almost exclusively use C, Perl and a numerics language (such as Matlab or Fortran): often times they're the appropriate tools for academic work and features like OO, generic programming and functional programming are considered (by them) to be distractions from their task. I remember taking a scientific programming class as an undergrad which briefly exposed students to Fortran90 (which is a lot closer to Modula-{2,3} or Pascal than it is to Fortran). I remember asking "how to do something like a void pointer or a templated class" and the answer being "why would you need to do this in the context of numeric computation?".

From my experience, most computer science students at universities (the type who got excellent marks in mathematics and did well on the AP Computer Science exam in high school, but didn't necessarily spend their nights hacking Linux since the age of twelve) tend to *hate* Haskell (language my university used for the 6.001/CS68a equivalent course), ML, Scheme and other languages that they're *forced* to learn and would rather program in Python, Java/C# or PHP. Programmers who are self-taught or who (like me) supplemented their formal CS education with extra-curicullar hacking, learning and industry work tend to be more interested in non-mainstream languages as they don't associate them with "that weird recursion class I had to take as a freshman". I suspect, the dynamic is not that different from industrial programmers hating Java/C#/C++ and yearning for Haskell and Lisp.

What programming language should someone learn if they've never programmed before but wanted to pursue an alternative job market?

My quip of an answer is PHP. (Browser differences with Javascript will drive you insane – don't start there. It's also object-oriented which is a whole other ball of wax I don't recommend at all, let alone for beginners. PHP is procedural and server-side, which means you can focus on programming instead of minutae.)

My real answer goes like this:

1. Programming is one of the most heavily outsourced functions around – why anyone would pursue it as a career strategy is beyond me. I am a PHP programmer (among many, many other things) and I hire other PHP programmers and I think the programming work that pays money in the US basically breaks down like this:

  • Corporate work – 90% is off-shored for cost savings. There will be some pendulum swinging against this as errors rise and quality falls and overall costs go up because it takes longer to get to quality product. However, by the time everyone really understands the financial implications of off-shoring and is willing to pay more up-front, the customization of core products will be at a point where either a) a non-programmer can get what is needed done or b) you need a very high level LAMP administrator-type (see the work being done in CMSes). Most of the jobs in this segment are for managers who talk to India in the early morning and again at night.
  • Google-type work – Unless you want to go back to college for a CS degree from a top 10 CS program and be in the 10% of your class or you're really out-of-this-world smart and want to read about programming for years to get up to speed, you're not going to qualify for these jobs.
  • Startup work – I think of this type as 24/7 live-on-caffeine work done by (young) people who taught themselves and don't necessarily have a structured or CS background. They either know too much or too little for their own good and personality (and/or geek cred) rules here.
  • General website work/freelance one-offs – This work is really more about design – especially now that WordPress and other CMSes exist. The graphics people are taking over this segment because they can offer greater customer satisfaction and charge less.
  • The segment I hire (which I think is occupied by me alone) – it boils down to people (aka men, as getting a female programmer resume just simply does not happen) with 10+ years professional experience (most of which is in a structured programming role, not freelance consulting) writing actual code because I am willing to pay for the experience level in exchange for the lack of bullshitting/babysitting.

2. What alternative job market are you trying to get into? If you want to get into a sector dominated by cross-platform work obviously you would want to choose Java. Find the job posting for the job you want and work to make your skills match it to make sure you don't go learn C++ when they need Python.

3. Programming languages tend not to work in isolation. You're at least going to need to communicate with a database in order to do anything of note so you're at least signing up to learn 2 languages. In the case of PHP I recommend pairing it with MySQL. There is also T-SQL/MS SQL and ORACLE, PostgreSQL, and many more which pair up in different combinations with programming languages.

That being said – putting alphabet soup on your resume in a big long list is just a sign that you don't know enough about any one thing to accomplish anything, so don't go overboard.

4. Start with Excel. Most people dismiss it as a Word table that can sum numbers together, but it's actually able to program some pretty complex stuff. Unfortunately, no one has written "How to Program with Excel" (that I know of). When you think of VLOOKUPs and PivotTables and "trace dependents" as the best things around you're ready to jump into PHP/MySQL.

Is JavaScript the most popular programming language in the world?

At this moment the web is certainly the popular and most widely used platform for application development.The rendering engine used in browser is leveraged to build cross platform applications like hybrid apps and progressive web apps. As you perhaps know JavaScript was born for the browser. If it is said that "C/C++ is closer to the machine" then it can be said that "JavaScript is closer to the browser".

Right now if you are building anything for the web or more precisely anything that is rendered with the browser's engine, you pretty much need to have JavaScript in your technology stack. (Try to recall the last time you had to use a website/ web application that does not use JavaScript !! )

Having said all these, let's take a look at Stack Overflow Developer Survey 2016 Results

(I hope you will take time to check out the whole survey)

Some key results that tops this survey :

  • Developer Occupations : Full Stack Web Developer
  • Most Popular Technologies per Dev Type
    • Full-Stack : JavaScript
    • Front-End: JavaScript
    • Back-End: JavaScript (Not my personal opinion, it's the survey results)
    • Mobile: JavaScript (6th)
    • Math & Data: JavaScript (5th)
    • Students: JavaScript (2nd)
  • Most Popular Technologies
    • 2016 : JavaScript
    • 2015 : JavaScript
    • 2014 : JavaScript
    • 2013 : JavaScript

(Source: Stack Overflow Developer Survey 2016 Results)

phew , that's a long list !!

Now, let's check out JavaScript in the open-source world.

It will be pretty obvious once you take a look at this question here : What are the most popular GitHub repositories of all time?

Or, the most starred repo at GitHub : Build software better, together

Or, the repositories with most forks on GitHub: Build software better, together

Before I finish, let me just remind you (as well as myself) that Stack Overflow and GitHub are just two metrics focused here to describe the popularity of JavaScript. And it is certainly expected that these metrics are not perfect and if we had used other metrics we might come up with different conclusions.

Where can I learn more about domain specific programming languages and language oriented programming?

In terms of macro-based DSLs:

Check out Doug Hoyte's Let Over Lambda:
http://www.amazon.com/Let-Over-L… . I found it to be very readable.

Graham's On Lisp is available online and is spoken very highly off.

Where can I learn more about computer science methods and algorithms that match and summarize different pieces of  text?

Foundations of Statistical Natural Language Processing
http://amzn.to/bQce4J

There are a number of books, but I like this one for starting out.  Towards the end of the book there is some information on automatic summarization systems.  The field is rapidly changing and there is nothing as up to date as the literature and the open source software frameworks, but this book lays a good foundation for finding the names of the algorithms you need to perform natural language processing tasks.

Many people however prefer this book for some reason;
Speech and Language Processinghttp://amzn.to/bO4Ebj

I have no read it personally but have been told that it is denser, covers more topics in depth and has the code samples you need to implement working systems.  I am not sure if any of these things are true.

Natural Language Processing with Pythonhttp://amzn.to/bSvGDw

I enjoyed reading this book and learned a little Python and some linguistics, however I am not sure I learned how to do anything that was useful.  Its a good book though.

Programming Collective Intelligence: Building Smart Web 2.0 Applications http://amzn.to/d7gL2s

This is another great book on Python.  It has some natural language processing stuff in it, but mostly limited to bag of words and spectral methods such as non-negative matrix factorization.  It has many code samples and is a joy to read.  I often copy and paste code from this book to get some RSS feed scraping and NLP stuff up and working very quickly.

What are the main advantages and use-cases of currying?

If your functions are in curried form, that makes it more convenient to partially apply them. It's never necessary, but it's often syntactically lighter. For example, suppose that you have a list of integers xs, and you'd like to add 3 to each of them.

In Standard ML, the operator + has type int * int -> int. If you want to add 3 to each element of a list using map, you need a one argument function that adds 3, which you can get by partially applying +:

map (fn y => 3 + y) xs

In Ocaml, on the other hand, + is curried — that is, it has type int -> int -> int. (The arrow right-associates, so that's the type of a function that consumes an integer and produces a function that consumes an integer and produces an integer.)  This makes partially applying + a bit shorter:

map ((+) 3) xs

These same techniques work in untyped, higher-order languages such as Perl and Python as well, but it's easier to explain in a typed language, where you can see the difference between curried and uncurried + in their types.

If you write your functions in a curried style, the order of the arguments affects which arguments you can partially apply conveniently. For example, given a list of floats in Ocaml, it's syntactically lighter to find the reciprocal of every number than to divide every number by 2:

map ((/.) 1) xs             (* reciprocal of every number in xs *)
map (fun x -> x /. 2) xs    (* half of every number in xs *)

There are a few solutions to this problem. One, employed by Haskell, is operator sections, which allow partially applying either operand:

map (1 /) xs    -- reciprocal of every number in xs
map (/ 2) xs    -- half of every number in xs

More generally, the Scheme cut macro (http://srfi.schemers.org/srfi-26…) facilitates arbitrary partial application. For example, given a vector v and a list of indices into that vector indices, we can set each of those indices in the vector to 0:

(for-each (cut vector-set! v <> 0) indices)

In this example, <> is the placeholder for the argument that isn't partially applied; cut actually allows an arbitrary number of placeholders. Note that this is not an example of currying, but an attempt to provide a more flexible way to do partial application than currying provides.