

How to Escape from {{ #PROGRAMMING_LANGUAGE }} - dmiladinov
http://deliberate-software.com/how-to-escape-from-programming_language/

======
epenn
While I won't say this is bad advice, I also don't think it's the best way to
truly free yourself in the manner I think the OP is getting at. In the long
run you'll be _far_ better off learning and cultivating rock solid CS
fundamentals rather than just hopping from one framework to the next hoping to
glean a little more from each. Having an in-depth understanding of the types
of data structures and algorithms that go into developing $new_hotness will
allow you to pick up different languages/frameworks/etc significantly faster
than just learning $new_hotness on the surface level.

Take parametric polymorphism [1] as a random example; i.e. what's called
generics in Java, templates in C++, etc. You might know how to use it in a
particular language and realize it provides some benefit. But if you truly
understand the underlying concept then you can quickly recognize it and/or
know to look for it in any language you pick up, whether it's Java, OCaml,
Visual Prolog, etc. Note each of those languages are in three totally separate
paradigms (object oriented, functional, & logic) and yet all of them still
make use of the same underlying idea to achieve a particular goal (in this
case, a form of type-safe expressivity). If you have a good understanding of
$random_fundamental_concept then all you would need is to take a couple
minutes to learn its syntax in your new language of choice and be on your way.
I chose that example because it was the first that popped into my head, but in
reality it goes for just about anything.

In short, with a good understanding of the fundamentals, you can make the time
it takes to learn something new that will invariably be based on them
significantly shorter.

[1] <http://en.wikipedia.org/wiki/Parametric_polymorphism>

~~~
djoes
I've been taking the Programming Languages course on Coursera, the motivation
for the course is exactly what you're talking about. "Syntax doesn't matter"
has become something of a catchphrase in the lectures, emphasis is always on
semantics and how different languages accomplish the same/similar things.

<https://www.coursera.org/course/proglang>

~~~
Nick_C
Snap, me too. It's a great course run by Dan Grossman (who pops up on HN
occasionally).

I signed up to learn functional programming and have learnt a lot.

------
sergiotapia
There are so many new tools coming out, but here's the thing:

_You don't really need to abandon ship every time something shiny comes
along._

Really, you don't. Use the tools that help you get the job done quickly and
efficiently. I jumped ship from .NET (asp.net mvc) to Ruby on Rails because of
three very distinct features:

1\. Cheaper hosting.

2\. A better baked-in ORM.

3\. Ruby made me more productive.

It wasn't because some random guy in Germany wrote a blog post and called it
the Next Coming of Christ - it was because I tried it out for a small project,
and loved how it made my life easier. Less time in front of the computer, and
more time with my family.

Just make sure you jump on the next big thing for the right reasons.

------
ef4
There's a better strategy than making bets on particular languages and
frameworks: get so good at learning that you can become proficient in any of
them in only days, and reach mastery in just months.

The biggest bottleneck I see that prevents people from being able to do this
is their code-reading skill.

With practice you can read and understand codebases much, much more quickly
than most people (who are so intimidated they never even try). Once you can do
this, you can very quickly pick up (1) the rich details about how the system
works, (2) the ability to extend the system and fix bugs in it, (3)
understanding of what is idiomatic and what is not.

~~~
dmiladinov
> become proficient in any of them in only days, and reach mastery in just
> months.

This! Could you please share your insights as to how to improve your code-
reading skill? Besides the obvious, "read more code". For example, how to
select which sources of code to read from, any tips/tricks you've learned in
your process, etc?

~~~
ef4
I want to second what div already said, with the added comment that it's
better to have a specific goal than to wander aimlessly through the source.

Every piece of software has bugs and limitations. When you encounter one, go
figure out why it is the way it is, and maybe even fix it.

If all your dependencies are so perfect that this never comes up (hah!), you
can always pick a project you use and like and look at their open issues.
Begin trying to solve one of them.

~~~
dmiladinov
Thank you so much for your reply! I like your advice, I think it's a great
place to start.

------
cpprototypes
As I'm getting older, efficiency in use of time is becoming a very significant
constraint. And I've found that learning a lot of languages is a waste of
time. It's mostly enough to just know two types, one static, somewhat low
level language (Java, C++, etc.) and one dynamic, high level language (Ruby,
JS, Python, etc.) I've decided that for me, those two languages will be Java
and Javascript. Not because they are vastly better than the alternatives. But
for the following reasons:

1) I already have years of experience in Java. And it's not a dead field.
There's Java 1.8 coming out, new libraries, frameworks etc. And there's the
added benefit that I can convince my workplace to adopt these things since
they use Java. That way I can efficiently use my work time to make money and
learn new technologies at the same time.

2) I also have years of experience in Javascript. And I've discovered that
Node.js can cover all the areas that I wanted Python to cover. It's good
enough for rapid prototyping web apps, command line scripts, and quick testing
of algorithms.

I came to this conclusion after time spent fighting a futile battle to become
good at Python. Learning the syntax was easy, there's nothing in Python that
was difficult to understand. However, I ran into the following issues trying
to truly master Python or any other language I don't use at work:

1) Zero reinforcement unless I spend my own personal time doing it. At work,
I'm using Java and Javascript 40 or more hours per week. And those hours are
when I'm at my most alert and energetic. Python could only be at night and
when I'm tired. Marriage will reduce that free time, and kids will reduce it
further.

2) Zero synergy from other developers. A workplace is also a community of
developers. My Java and JS skills stay sharp and increase because I can
constantly talk and discuss with other developers. I learn best practices,
things to avoid, trends, etc. I get none of this with Python unless again I
spend personal time to do it.

3) I made some small projects with Python. But a moment came when I realized,
it doesn't matter, I'll never even come close to how good I am at Java and JS
with Python. It was when I read some random post somewhere about how requests
library is so much better than urllib/urllib2. And indeed it is. But if I had
not seen that random post, how long would I have stayed ignorant until I found
out? For someone who uses Python at work, such knowledge spreads quickly. Also
just staying up to date on what's happening in the Python world can help gain
such knowledge. I was already spending time keeping up to date with the Java
and JS worlds. I just didn't have time to keep up with Python too.

I really liked Python a lot. It's a clean and practical language. But node.js
fits much better with my skills and although I like the Python language better
than JS, I'm a lot better at JS and will continue to be so since I use it at
work.

I guess the TLDR of this is that yes you can try to learn and become good at a
language and its community of libraries and frameworks in your personal time.
But it's so much more efficient to just become better at the languages and
frameworks you use at work and then use that experience to become good at new
technologies for that area.

Perhaps the final breaking point that lead me to abandoning Python in my
personal time is when I realized, I could've spent all that time building
something on the side. I could've used my existing Java and JS skills to make
an app or website or anything. And I could've done it fast, quickly, and with
the confidence that comes from truly mastering development tools. Instead I
wasted it to gain a useless amateur understanding of Python.

~~~
gngeal
"And I've found that learning a lot of languages is a waste of time."

I'd say that your time would be much better spent learning language concepts
and learning to implement them yourself in some sane environment, like OMeta,
for example. This way, you could 1) do the incremental changes you want
(instead of throwing away one language wholesale and learning another from
scratch), 2) recycle the execution environment you _have_ to use (e.g., at
work, instead of being forced to switch), 3) broaden your horizons in a
fundamental way (learn about type systems, implementation techniques etc.).

"But it's so much more efficient to just become better at the languages and
frameworks you use at work and then use that experience to become good at new
technologies for that area."

That's exactly in line in what I'm suggesting. Also, wait until Javascript
gets tail calls (coming in EcmaScript 6), and you'll be able to implement a
vastly increased range of additional language features yourself, in an elegant
way (think CPS transforms).

------
klibertp
I'm sure that there will be people here complaining that the particular stack
you're working on now doesn't matter, that a good programmer is a good
programmer whether she writes code in Forth, Fortran or C (or Fortran in C).

This is true in the same sense that quicksort is faster than insertion sort -
that is when we ignore _some constant_ and are interested in asymptotic
performance.

Very few companies are able to ignore this constant and hire someone who -
being as good a programmer as he is - for half a year will be less then
proficient and then for two more years will be still under-performing in some
cases. Companies would be stupid to ignore _this_ constant, especially given
that in three to four years the programmer in question will leave for a better
work.

For the vast majority of jobs it really matters what software stack you know
and it's not really a bad thing to do for companies to check for that when
hiring.

It's also worth noting that learning a language is something entirely
different than learning to _use_ a language. That's why it's that important to
actually build something when learning - because then you are forced to use
various tools that come with the language, it's entire stack.

~~~
tterrace
I think your constant is way too high, if a new hire can't get up to speed in
six months and is still floundering after two years then I don't think the
right hiring decision was made.

~~~
seanmcdirmid
How long does it take for an architect to master autocad or a visual designer
to master illustrator? Would you expect to hire either if they didn't have
mastery of those tools? If not, then why do we expect programmers to master
languages and platforms more quickly?

~~~
dagw
_How long does it take for an architect to master autocad_

A hell of a lot less time than it takes to master architecture.

 _Would you expect to hire either if they didn't have mastery of those tools?_

Back when I worked at a 3D animation studio they hired a a guy who had
literally never used a 3D animation or modeling package before. He had however
spent 20+ years doing concept and character design, sculpting, stop motion
animation and model building. It took him about 8 weeks to become proficient
enough at Maya to start turning out character models that outshone most of the
others (admittedly at a much slower pace). He could also just look at other
peoples models and instantly spot subtle changes that totally transformed the
models.

Basically if you're hiring an architect or designer based or their mastery of
software, you're probably doing it wrong.

~~~
seanmcdirmid
_A hell of a lot less time than it takes to master architecture._

Autocad takes more that a few years to master, your architecture degree is
only like 5 years + an apprenticeship. Yes, you will master autocad before
architecture, but you will likely not have time to master any other competing
cad package that doesn't greatly resemble it (hence, lock in extreme), if you
also want time to master architecture.

 _Basically if you're hiring an architect or designer based or their mastery
of software, you're probably doing it wrong._

Think of this as a bare minimum. You don't want to hire a young visual
designer who doesn't have adobe CS proficiency. Of course, they should be good
designers also. But you might make an exception for someone senior
(experienced) who predates Adobe and does everything the old fashioned way;
their skills are still very useful.

I've never been involved in any hiring 3D artists.

------
xtrumanx
I've been trying for so long now to do something different. The largest
obstacle I've faced is letting go of expectations.

Having worked with Asp.Net MVC for years now, I've found how Express on NodeJS
handles form validation to feel very cumbersome. Technically, it doesn't even
handle it and one has to rely on third party modules or one's own wits. After
struggling with that one bit for a few days I dropped nodejs and moved on. I
enjoyed making ViewModels with DataAnnotaions in .net that two top validation
related modules I looked at seemed weak in comparison.

Now I'm trying to learn Play! using Scala. But the IDE support isn't as good
as Visual Studio especially in the View templates. I've only tried the Scala
plugin on Eclipse. The Play! plugin in IntelliJ IDEA only works on the
Ultimate version which sounds expensive so didn't bother looking into it.

I just installed Ubuntu on my computer and really want to make the switch from
Windows+C#+Visual Studio to Linux+Scala+Play but all those years getting
comfortable in .net I feel will really hold me back. Everytime I hit a wall
I'll be thinking back at how much easier this would be if I was using .Net or
Windows that I feel this will be my biggest problem I would face.

~~~
hkarthik
I'm curious if you're given Ruby and/or Rails a shot?

I jumped from .NET to Rails 3 years ago and found that the ecosystem being
mature and large helped me get over all the typical humps of losing IDE
support (I code in vim full time now) and switching to Unix. Had I jumped in
2006 or 2007 like some of my colleagues did, this would not have been the
case.

I definitely think that these days Node and Play are on the rise, but based on
your post I think you should consider something a little easier to slide into
for someone more used to a mature ecosystem. Once you get into the Unix-based
way of programming, it won't feel like such a painful leap to jump to Scala or
Node.

~~~
xtrumanx
Actually I started out with Ruby then Rails in 2009 and moved then moved onto
.Net.

Ruby and Rails will always have a special place in my heart as that's where I
first truly learned how to program after being beaten into submission by Java
in university. I think the point I hated programming was the time we needed to
build a Swing app using Notepad. Then over a year after graduation I found
Hackety Hack and _why's poignant guide and everything clicked and I knew all I
wanted to do was to code.

However, as much as I loved Ruby, .Net opened my eyes to the wonders of static
typing and I don't think I could live without it. The only reason I considered
NodeJS and Express was because I was planning on replace JavaScript with
TypeScript after learning the basics of NodeJS and Express.

I just installed Ubuntu on my PC last night and this time I'm trying to learn
it right. No more copy pasting stuff into the terminal like the last 15 times
in the past 8 years I've attempted to learn Linux. I make sure to read the man
pages of every command before I run it so I know what its doing. I've must of
extracted archives tons of times but today is the first time I understand what
the arguments -xfv mean in tar -xfv FILE :)

My current methodology has me moving ever so slowly. For instance, after
downloading Eclipse, I knew better than leaving it at my downloads directory.
So a google search told me to put it in /opt. But that just leaves me
wondering what the heck /opt is for. Some Googling led me to a document
entitled "Filesystem Hierarchy Standard" which explains what all the
directories in the root are for. Trying my hardest not to think about how much
quicker things would be moving along if I just give in and carry on in Windows
>.<

~~~
hkarthik
Awesome well kudos to you for pushing forward with the Unix learning. My
suggestion is to get a good local mentor or coach that you can email or have
coffee with once in a while to bounce things off of. That did wonders for me
when I got into Ruby.

I still say you should consider just buying a cheap Mac, a lot of the things
you're finding challenging aren't as big a deal. The Mac makes Unix A LOT more
approachable :)

------
CHsurfer
Wondering if GO would be considered a good candidate in the 'exotic' category.

    
    
      -People seem to enjoy programming with it
      -Makes somethings very easy (concurrency)
      -Standardized formatting, makes everyone else's code easier to read or vice-verse.
    

Just not sure if people are doing 'work' yet or still mostly playing with it.

~~~
lclarkmichalek
From what I've seen, people spend more time mentioning it on every single PL
related post on HN than either working or playing with it ;)

~~~
voidlogic
How do you know this is the case, that is people who talk about Go a lot do
not use it? I often talk about Go on HN, I also use Go for my work and
personal projects and write Go 10+ hours a day... Many of the people I see
talk about Go on HN are active on github and golang-nuts... I know they are
writing Go.

------
emehrkay
"Fill your github with work in that language."

I love this advice. I think that I want to tackle building a Node application
as my next "weekend project." I dabbled in the very beginning, but today, Node
is very mature and the barrier to entry is extremely low.

~~~
Cyranix
I set up the beginnings of my first Node app this past weekend with Express,
Stylus + Nib, and Handlebars (plus nodemon and livereload, though I think I
may need to add a little Grunt + regarde to get the most out of livereload).
Very enjoyable to get started with, and there are plenty of other solid
options for your stack if those selections aren't to your liking. [Feel free
to email me if you want another Node newbie for discussion.]

~~~
emehrkay
Cool. Thanks for the connect. I love our community sometimes

------
jeremyjh
> Resist the urge to cynically compare and contrast the old and new stacks. I
> have interviewed too many candidates who could not stop talking about how
> great their old language is, or how “these new hipster languages are just a
> fad”.

I thought at first this was headed in the other direction - e.g. candidates
who could not stop talking about how great their new language is and how their
old language is "a dinosaur". That is the tendency I have - to inflate the
advantages of languages that interest me most because of their novelty to me.

------
AlexeyBrin
No matter how much you love a certain language you should always keep an open
mind and learn something new.

If you are an expert in OOP, try to code for a few months in a functional
language.

~~~
psionski
That's what I do, although not for the reasons in the article; I just get
bored quickly (gen Y lol) and learning radically different languages and
paradigms is just so much fun :) It also seems to help in my main language
(C#), after learning Haskell my C# 3.0 programs have gotten way easier to read
and understand.

------
tterrace
I wouldn't say a good escape route from a particular stack is to just jump
into learning another one, you're just picking another small area of
specialization. If you have a good understanding of the fundamentals, the data
structures and algorithms under the hood, you're much more employable than
someone who's memorized the idiosyncrasies of a few web stacks.

------
gtani
i suppose by "exotics" he/she means

\- _Theorems for Free_ languages: haskell, scala, ocaml,

\- lisps: CL, Scheme/racket, clojure

\- logic programming/unification: prolog, mercury

\- stack-based/concatenative: joy, forth, factor

\- O-O paradigm: D, eiffel, smalltalk, scala(again)

\- others I keep hearing about: Golang, rust, kotlin, Mozart/oz

