
Ask HN: What cool development languages/tools changed your career? - mirceasoaica
I&#x27;ve been a web developer for the past 10 years and I&#x27;ve mostly used PHP in my projects. I&#x27;ve also had a chance to code in JavaScript, C#, Delphi. I&#x27;ve had the chance to build large website (&gt;500k users&#x2F;day) and desktop apps used by millions of users per month, but I always used the technologies that felt comfortable to me. I knew Zend Framework very well, so I used that one to build the services.<p>My &quot;oh wow&quot; moment was when I discovered Phalcon PHP framework (https:&#x2F;&#x2F;phalconphp.com&#x2F;en&#x2F;) about a year ago. I&#x27;ve switched all our projects on this framework and saved thousands of $$ because of the performance impact.<p>The other thing that made my day was when I discovered Django (https:&#x2F;&#x2F;www.djangoproject.com&#x2F;). I never knew Python, but I decided to give it a try. The performance is amazing (I always thought that it was slower than PHP - I was wrong) and it seems I can build the projects faster that I ever could using PHP (with any framework).<p>What were your &quot;wow&quot; moments in your career? What was your best decision to improve your work?
======
votr
Clojure. Before learning Clojure, I didn't even have a career. I just wanted
to get into software development.

But at the time, all I knew was a bit of Python. And while I could've learned
Java, I figured that being yet another Java programmer in the marketplace, but
with no experience and a liberal arts degree, was probably going to get me
nowhere.

So I decided I had to learn something emerging. Something where there was
nascent demand but not much supply. I chose Clojure because it looked weird,
and all these bright people were talking about how great it is. I invested a
couple of months learning it deeply, open-sourcing my side projects, and
blogging about it. I also spent that time learning non-programming
fundamentals.

When I felt I was ready, I started reaching out to people in the community and
companies on "Who's Hiring" threads mentioning Clojure. Within a couple of
months, I landed my first full-time programming gig at an investment bank.

I know that if it wasn't for Clojure, I wouldn't be here today.

~~~
heyts
I'm very interested in learning Clojure. Would you care to share more of your
experience learning the language in terms of learning curve, useful libraries
or just general tips. I'm sure that would benefit the community at large.

~~~
votr
I approached learning Clojure the way I approach learning everything else. I
survey the resources available, then pick the two best books. Ideally, I want
them to come at it from different perspectives. e.g. one may place an emphasis
on doing stuff with Clojure while another may be more about functional
programming.

At the time, they were:

[https://www.amazon.com/Clojure-Programming-Chas-Emerick-
eboo...](https://www.amazon.com/Clojure-Programming-Chas-Emerick-
ebook/dp/B007Q4T040/ref=sr_1_1?s=books&ie=UTF8&qid=1477404159&sr=1-1&keywords=clojure+programming)

[https://www.amazon.com/Joy-Clojure-Michael-
Fogus/dp/16172914...](https://www.amazon.com/Joy-Clojure-Michael-
Fogus/dp/1617291412/ref=sr_1_5?s=books&ie=UTF8&qid=1477404159&sr=1-5&keywords=clojure+programming)

I then wrote a data processing app in Clojure; consuming financial data and
finding patterns in it.

My suggestions are: 1) If this is your first time learning a functionally-
oriented language, clear your mind from any kind of assumptions picked up from
other languages.

2) Get a handle on the core tenets of functional programming: immutability,
purity, composition, and functions as objects. If you know Javascript, then a
lot of this stuff may already be familiar to you. JS is underrated in that
department imo.

3) To me, writing programs with Clojure is akin to playing with Lego. You
write your base functions, then higher-level functions which use those base
functions, and so on. Functions all the way down.

4) Write something with it; it'll force you to decompose your program and
think functionally.

Clojure is a simple, opinionated language. I don't think you'll have a hard
time picking it up at all. The hard part will be to think in a manner amenable
to it.

These days, I think Clojurescript has overtaken Clojure in terms of traction,
so if you're into webdev, then CJS would be a natural next step.

~~~
Veen
> You write your base functions, then higher-level functions which use those
> base functions, and so on. Functions all the way down.

I'm hoping to follow a similar trajectory to you, but with Elixir instead of
closure. At the moment though, I tend to do things the other way around: write
the top level functions and then fill out the base functions.

So I'd start a module with

def whatever(something), do: something |> function1 |> function2 |> function3

Then I'll write function1, 2, and 3 and whatever helper functions they need.
And so on until it works. Maybe doing it your way is a better approach: helps
you think it through first.

(although I'm aware some would say that tests should come before everything
else anyway)

~~~
bpicolo
It is useful and necessary to use both directions at times. You can't always
presuppose the relevant details. But do be ready to factor away functions at a
moments notice

------
cagataygurturk
My wow moment was when I quit trying to do everything in the language I was
comfortable with (PHP) and became a language agnostic engineer. Since then (2
years ago) now I can write in 3 programming language, nobody can realize that
I am new at these languages and I know that I can pick a new language up now
in a very short time. I had to study so much in these last 2 years but since I
love engineering it was funny rather than tiring. You do what you like and
they pay for it, that is perfect. Before I used to search for PHP jobs and end
up in low quality companies. After forgetting about languages, removing my
limitations and focusing in engineering more than stack, my career
significantly improved. Actually I got a tech management job in a big American
company that I'd never imagine before.

~~~
kzisme
I'm just starting my career as a dev, but my first language in school was C++.

At work I use C# - but I hope to keep learning more languages. The main thing
I was worried about initially was being stuck with one language my whole
career.

Anyone else ever feel that way?

~~~
shados
With the way the market is, unless you stay at one job forever, its actually
hard to stay with the same language... the world changes, opportunities
change, your interests change...you'd have to try very hard to stick to one
language.

Now, on that topic, what's much harder than learning multiple languages, is
learning multiple language paradigms. If you have a C++ background, learning
C#, Java, Swift, JavaScript, whatever is pretty easy.

Learning Haskell, ML, Elm, F#, Clojure, etc...now that will make your mind
bend and spin for a bit. Those aren't nearly as common in a work environment,
but you can gain a lot from learning at least one.

This is kind of similar to how if you're an english speaker, learning another
european language isn't nearly as interesting as learning a CJK.

~~~
kzisme
I'm just trying to learn all the in's and out's of my work language then I'll
start branching out more.

Being stagnant as a developer is something I never want to happen.

------
dsiegel2275
For web development: React.

I have been developing web applications on and off throughout my now 20 year
career - all the way back when Applets were all the rage. Spent time with a
host of technologies and approaches: JSP/Servlets, JSF, Struts, GWT, Backbone.
React has been hands down the most productive technology I've used in web
space. I'm so productive using it that I now _enjoy_ doing front-end
development again. I've recently moved away from ES6 via Babel to using
TypeScript with React and have been even more productive as I'm now catching
more bugs either in the editor or at 'compile' time.

I'm now looking at Elm.

~~~
Impl0x
What have been your impressions with Elm so far? I started playing with it
recently since I enjoy Haskell but I'm coming from it with no prior web
experience so it's hard for me to gauge it in most aspects.

~~~
grayrest
Different poster, but I have an opinion.

I think that if you're going to do React/Redux, your life would be easier in
Elm.

I'm a full time Clojure/Clojurescript dev and from my perspective, the main
thing Elm is lacking is Protocols (in Clojure/Swift, Traits in Rust). I know
Evan has been pushing back on it because it adds complexity to learning the
language and you can get by without them, but I miss them. I could quibble
about other things but there's nothing I strongly dislike. From an adoption
perspective, I think a focus on tooling would help a lot. There was a talk at
elm-conf where a refactoring suite was written as a chat bot. Ditching the
chat bot part and building a language server [1] would make it much easier to
pitch the language.

[1] [https://github.com/Microsoft/language-server-
protocol](https://github.com/Microsoft/language-server-protocol)

For a non-web developer looking to transition into web dev, the main weakness
of Elm is that the community is small so you basically have to build your
components yourself. This tends to be challenging for experienced programmers
coming from other languages because CSS has no abstractive power at all and
the traditional layout techniques are incredibly unintuitive. You'll probably
have the most success using flexbox everywhere. The community is friendly and
I think Evan does a pretty good job leading it. I've pushed a number of
younger developers at js meetups to pick it up and they've reported back with
positive impressions. Of the compile to js langauges I know, I'd pick Elm as
the most likely to succeed.

Overall, I like Elm and am happy with it's progress. I don't think it's ready
for unqualified adoption, as you'll be doing a lot of library building you
wouldn't need in more mature ecosystems and I'm not completely confident it's
on the path to great success. I wouldn't push the language in a workplace at
this point. By comparison, I would push Rust. You're in largely the same
position in both languages in terms of writing libraries but I think Rust has
hit critical mass.

~~~
optionalparens
I'd agree with most of this. I feel like the decision to use the JVM is what
made Clojure useful at work for me vs. other languages like Elm, Elixir,
Haskell, and so on that I can only just play with at home. Elm is cool but I
can't justify it professionally.

People really should not discount the importance of having a big ecosystem, at
least transitively in some way (ex: Clojure -> Java/Scala/Groovy). Once upon a
time I took a break from C and C++ dev to do Smalltalk. It was glorious and
productive, but at the same time I had to literally write everything myself.
The community, even at the height was relatively small vs. some languages
today. The worst was writing low-level stuff that while I could do, gave me
the voice inside my saying, "WTF why am I wasting time on this." No one should
ever do that if they can help it; it just eats your time.

The only real situation that comes to mind where I personally felt justified
reinventing the wheel entirely was game development (ex: custom allocators,
custom pipelining, entity systems). That still was time lost I could have been
using to make a game and get other things done, but there were very good
reasons like performance. Console development in particular was exactly this -
it's not like I could go out and ask someone for their NES libraries or even
in later years, PS3. Games don't generally reuse much code and certainly not
when a generation of consoles is brand new with a new architecture. I could
have written code like an idiot, but I chose instead to write stuff against
the platform. We did well because of it vs. competitors. You can say Engines
handle some of that for my specific cases, but that's discounting that huge
chunks of a game are not in fact the engine or that some games preclude the
use of an engine for various reasons or engines sometimes end up having the
opposite effect (ex: Star Citizen).

------
RodgerTheGreat
About 2 years ago I discovered a programming language called K. It's a very
unusual-looking, extremely terse language in the APL family. It just "clicked"
for me. I enjoy the ability to experiment with different algorithms and
approaches in a few keystrokes, and learning to think in a "vector-oriented"
fashion has opened my eyes to much more elegant formulations of old problems.

There aren't many extensive tutorial materials available for K, so when I
decided to learn it I pored over the reference manual carefully and wrote an
interpreter to try to match the spec. I built programming environments on top
of my interpreter which are probably only suitable for my own use, but they
make me deliriously happy to use. I made connections with both seasoned K
programmers and other enthusiasts through my open-source projects with the
language. Eventually I was approached with a few offers, and I am now
gainfully employed by a firm which uses K more or less exclusively for backend
work.

If you find a niche that makes you happy, and you're willing to invest the
time to develop an unusual area of expertise, a career can follow naturally.

~~~
jnbiche
At the risk of spamming the same question to everyone who comments here with a
less common language, are you employed remotely? Someone asked a question on
Ask HN a few days back about whether learning a less common language made
remote work more feasible. Do you get many remote opportunities as a known K
programmer?

~~~
RodgerTheGreat
I have done some remote work related to K, but it seems that most of the
places that are hiring K programmers want them physically located near finance
hubs. For my current job I had to relocate to NYC. It's a bit of a mixed bag,
and not my ideal place to live in the long term, but I am very much enjoying
working at this company.

------
dragonquest
Learning Lisp, more specifically Scheme. I became curious about it after
reading ESR's "How to Become a Hacker". When homoiconicity and other Lisp
goodies gradually permeated my brain, the computing world seemed different.

I saw every config file differently, trying to see how the lines between
config and code blurred. Method abstractions and bottom up design became much
easier. I appreciated all those prefix-evaluation assignments in college. I
found a new respect for languages with good REPL's. And finally, it opened my
eyes to computing history, where I discovered newer is not always better. The
elders of old really got many things right.

~~~
shakna
Scheme changed everything for me.

I feel sad when I hit special forms in languages, and can't just a macro to
change the language to suit the way I want to do it.

It made every other language I used feel overly verbose. Sure, Scheme is a bit
verbose, but with two or three macros, and a handful of recursive functions, I
write about 1/3 of the code I would in another language.

Having readers, and parsers exposed makes it so easy to fit the language to
the task, rather than bludgeoning the language with a hammer, or rephrasing
the question till it almost fits.

Random example:

You need to allow a user to run half a dozen functions, with a syntax.

Normal approach, (after you've argued you shouldn't do this), is to write a
parser and evaluator, and hope you didn't expose a security hole like SQL
injection by accident.

Scheme approach: Generate an empty environment, attach only the necessary
functions. Parse and handball to the environment.

Eval doesn't have to be evil, especially when the language provides the tools
you need to sandbox users.

~~~
Ao7bei3s
It's still evil - what if the input program doesn't halt, or allocates too
much memory?

~~~
shakna
You design the functional building blocks. So a non-halting program would
likely use a single stack, and never grow. But more than that, you can use
continuations to abort the moment the calculation is too large.

~~~
codemac
Any examples of using continuations to abort when the calculation is too
large? Still grappling with continuations, familiar with coroutines/csp/fibers
much more for concurrency, but trying to get call/cc fully under the belt.

~~~
shakna
I'd probably nest a named let inside a continuation. Raise an exception when
an iterator goes too long. Something like that.

I tend to avoid continuations in production code, because how it reacts very
much depends on what you're accomplishing. Most exception handling frameworks
use continuations, which you can accidentally turn into infinite loops if you
don't abort the loop properly.

------
lmm
Scala, back in 2010. I realised that I didn't have to sacrifice productivity
for safety, I could have it all: code that's more concise than Python, but
safer than Java. Best thing I ever did was finding a way to try it in my then
job (a low-risk standalone tool); over the next couple of years I shifted
gradually into doing more and more Scala, and now use it full-time.

~~~
ljw1001
> more concise than Python, but safer than Java

really? or was that supposed to be the other way around?

Personally, I can't help thinking of scala as a hipster beard on the face of
java.

~~~
59nadir
Opinions on Scala aside, it should be said that Python isn't the epitome of
conciseness that a lot of people think it is. There are more concise languages
out there and languages that are as concise as Python that end up offering
more elsewhere.

~~~
lmm
There are languages that use a denser notation than Python for the same number
of syntactic elements, but I don't think many allow you to express the same
things in fewer elements. It's famous for looking like pseudocode, which
suggests it contains exactly the information that humans need to communicate.

~~~
59nadir
I would argue that pseudocode doesn't present the "end goal" of readable
brevity.

Without getting into specifics all too much, an example of things that can
make code much shorter, yet readable, is piping data through a series of
functions, which is something that Python doesn't allow without repetition, as
far as I know. There are lots and lots of things you could point to. I don't
think the point is to change Python, but I do feel that people who are too
snowed in could accept that the time wherein Python was the most concise, yet
readable language has passed quite a while ago, so it might be less of an
argument for Python than they'd think.

The same will end up happening with the "ecosystem argument" as well, by the
way. It will be touted as Python's greatest strength 10 years into the future
when it no longer holds true, but since it's something that's been repeated
for tens of years it'll still be repeated, based solely on history.

------
drittich
Git. I had many years of experience with various source controls systems, but
it wasn't until a few months with Git that I realized it took away so much of
the friction I had been living with in terms of being able to do fast context
switches, experimental branches, recovery from bad mistakes, and sheer
performance of working with very large repos. It is a tool I rely on and
admire almost every day of my life.

------
tzhenghao
Vim. I was first introduced to this text editor back in college. It has super
weird navigation rules and editing modes that would easily deter many
beginners. 70-80% of my course mates gave up on it and chose something else
that worked more like a normal text editor such as Sublime/Atom.

It took me several months to develop that muscle memory to increase my
productivity. Today, I can log in remotely to my AWS instance, edit a few
files and do it all without leaving the terminal. I hear similar benefits on
the Emacs camp too.

The steep learning curve was well worth it. I don't think I've shipped any
source file without opening/editing it on Vim before.

~~~
chapingt
how do you feel about Vim plugins for external code editors (particularly, I'm
thinking VS Code)? I somehow end up developing on new Windows machines all the
time, and getting all the Unix emulation tools _just_ so I can use Vim seems a
bit over the top. Are there any enormous advantages to using Vim vs. a Vim
emulator?

~~~
grayrest
> Are there any enormous advantages to using Vim vs. a Vim emulator?

There are lots of vim commands and most emulators do not implement the entire
set. Macros, register recording, text objects, correct repeat, recursive
keymappings, bookmarks/jump history, and ex mode are the most frequent
casualties. Because everybody has a different subset of vim commands they use
an emulator that works fine for one person will be unacceptable for others. I
personally can't stand any of the VS Code vim plugins, which is a shame
because I really would prefer to migrate from vim to vscode for the rest of
the vscode ecosystem. The best emulator I've used is Evil (the emacs one,
install spacemacs if you want to give it a go) and I find the InteilliJ and
Atom emulators to be okay.

There's also plugins that are almost never carried over to emulators (though
surround is in Evil):

EasyMotion [0] - Lets you jump around in complicated ways. I use the following
config to be able to jump around in a minimal number of keystrokes:

    
    
        let g:EasyMotion_keys = 'jfkdlghtyuievnbsa'
        let g:EasyMotion_smartcase = 1
    
        nmap <space> <Plug>(easymotion-bd-W)
        nmap <S-space> <Plug>(easymotion-s)
    
    

Surround [1] - Lets you surround text objects and delete surrounding stuff
easily. I use the following to save keystrokes, since I find `sw"`
considerably easier to type than `ysiw"`.

    
    
        nmap s      ysi
        nmap S      ysa
        nmap s$     ys$
        nmap sv     gvs
    

[0] [https://github.com/easymotion/vim-
easymotion](https://github.com/easymotion/vim-easymotion) [1]
[https://github.com/tpope/vim-surround](https://github.com/tpope/vim-surround)

------
caleblloyd
I have just started using C# and .NET Core after years of dismissing it when
it was only available on Windows. Now it is open source and cross platform! I
come from a PHP background but have been writing smaller performance critical
code in Go lately.

C# is a pleasure to work with. It's got generics and good support for
asynchronous I/O. .NET Core is also very good, it's dead simple to spin up an
API serving backend using .NET MVC.

Lastly, I think the community is great. I have jumped into a couple different
projects - one is a MySQL driver and another is a MySQL implementation of the
EntityFramework ORM. I was able to contribute after just a few weeks of
working with C#. Microsoft seems very dedicated to continually improving the
language as they develop in the open on GitHub and take user feedback.

~~~
staticelf
Me too. I also came from a php background and I love the new .NET Core,
Typescript and so forth. Funny is that I've always been dismissing .NET for so
long and been a heavy Linux user. I never thought the day would come where I
prefer .NET and Azure.

Although, professionally I basically only do frontend work or node work. So
javascript is pretty much what brings in the cash each month nowadays.

~~~
caleblloyd
> I never thought the day would come where I prefer .NET

Right!? Half my co-workers still think I'm joking when I say C# or .NET

I still strictly develop C# on Linux, using JetBrains Project Rider and VS
Code. I run production apps on Google Container Engine.

I'll test in Windows for cross platform apps using Visual Studio Community
Edition from time to time. Never messed with Azure but I think they have some
nice integrations with Visual Studio.

~~~
V-2
Is Project Rider usable already? I remember it was sort of in alpha not long
ago

~~~
caleblloyd
It's still in EAP, but has stabilized a lot in recent builds. The debugging
story is not quite there for .NET Core, so I switch into VS Code for debugging
right now.

------
scardine
Python saved my but 10 years ago when I was transitioning from operations to
be a full time software developer. Back then I made the wrong technology
choice for a project (OpenLazlo, a discontinued RIA platform on the frontend
and PHP at the backend) and the schedule was slipping fast. Then I tried
Django and it really stands for the motto "The web framework for
perfectionists with deadlines".

I'm yet to find a language that allows fast prototyping while being readable
six months after you wrote it - I used to love Perl, it is on pair with Python
on productivity and blows it out of the water in performance, but I can't say
it is easy to maintain.

~~~
mountaineer22
I know of a successful SaaS that is currently using Perl for data
cleaning/importing.

~~~
leblancfg
I guess that's not tooo surprising, given the backronym "Practical Extraction
and Reporting Language".

------
kentosi
Though not a language, nor a tool: A touch typing course.

Early in my career I noticed programmers around me with 10+ years experience
still typing the "preying-mantis" way (thumb+index+middle fingers pecking at
the keyboard, head frantically bobbing eye-focus between keyboard and screen).

I thought to myself that if I had the same experience as them and could touch
type I would be immensely faster.

I was right. Typing faster = coding faster = learning faster.

~~~
benzor
I completely agree that a minimum typing speed makes a huge difference.

That being said, the code output bottleneck is usually my brain and not my
hands!

~~~
npolet
Very much so. I think a lot of people who code or know much about it are
surprised by how much abstract thinking there is involved when programming. I
would love to time my work hours (somehow) over the course of a few months and
see the amount of time spent thinking and jotting ideas down, to actually
writing code.

I work closely with non-developers a lot and they have mentioned that they
didn't realise how 'big' programming, languages, algorithms etc... are. There
is a hell of a lot of stuff to know. But I suppose this is the same with many
industries.

~~~
otakucode
It can be problematic. Many leaders of companies think programming is a matter
of typing. We've had a monumental fundamental shift in the workplace from
repetitive physical labor (manufacturing) to mental labor, and the workplace
has not caught up at all. They're still using the same structures and
practices honed to perform well in manufacturing contexts. Human beings have
very different needs and capabilities when it comes to mental work. But we
still drop people in a big noisy open floor plan office, expect 8+ hours a day
of continuous exertion, and load daily schedules up with distraction.

------
CalRobert
In a sense, Javascript.

But more importantly, when I read Javascript: The Good Parts by Douglas
Crockford. It was my introduction (though I didn't realize it) to functional
programming, closures, and thinking much more about scope. I went from
thinking of JS as a pile of junk to a language with remarkable flexibility.

That doesn't mean I do everything in JS, but I find I like the language a lot
more than most of my peers.

~~~
6DM
That book definitely gave me a leg up on JavaScript, but I feel the real "ah
ha!" moment came with this book, "You don't know JS, Scope and Closures". I
can't recommend this book enough.

[https://github.com/getify/You-Dont-Know-
JS/tree/master/scope...](https://github.com/getify/You-Dont-Know-
JS/tree/master/scope%20%26%20closures)

------
kleiba
Emacs.

I remember finishing college in the late 90s and coming across Emacs
(actually, XEmacs back then) for the first time. What a weird editor, how
could anyone even want use this voluntarily? Until some coworkers at the place
I worked back then showed me some tricks. The touch of enlightenment hasn't
stopped ever since and probably never will.

~~~
jasonm23
Testify!

Emacs is so mysterious, some people actually think it's a Text Editor.

It's like saying Android is a Phone.

------
calebm
Python, coming from C/C++, Javascript (at least circa 2003) was like leveling
up 10x in my programming superpower. I was able to explore concepts and
domains so much faster, and those concepts have led to my career. I've talked
with friends who only know something like C# or Java, and I feel bad for them
- they have no language in which to rapidly play with things. And that rapid
ability to play (like with the Python REPL) makes a huge difference in
learning.

~~~
nhatbui
I can't agree with this more. Coming from C/C++, I was hindered by worrying
about memory management and building everything from scratch. Python and its
standard library just allowed me to wrap my head around algorithms.

------
col_rad
I started as a backend Java engineer for a large ISP. I loved it, I didn't
what to do anything else. When I joined a consulting agency they put me in a
company that had pretty good backend engineers. What they completely lacked
was the frontend part. The product developer and the customers demanded a more
dynamic interface but none of tech seemed to care. All said 'it's not
possible'. So I started learning JavaScript, learned AngularJS (which was
brand new at that time and fitted great in the corporate/enterprise setting),
built a couple of sideprojects and then started evangelizing Product and Dev.
I was allowed to improve a first Product, which was a great success. Then
every product developer wanted webapps. So I started teaching developers at
the company and the consulting agency.

This taught me: Find the tool that does the job. Even if you think the tool
looks stupid.

------
pryelluw
This is such a great question. In my experience:

\- Django has been simply amazing to work with. It is the framework with which
I measure other frameworks. Its far for perfect, but it has the features I
need. It can also be customized to most requirements. Sure, it has downsides,
but they don't get in the way as badly as other frameworks.

\- Angular changed my opinion about front end development. My experience had
been with Jquery heavy websites. Never with something better engineered from
the start. Angular has issues that I'm very aware of, but it opened up my eyes
to the world of better javascript programming.

\- React took what I leatned from Angular and just made it easy to use. Which
was my #1 issue with Angular. It was too bloated. React is so much simpler.

\- Visual Studio Code made me open up to newer text editors and IDEs. I've
mostly been a Vim user. But VSC has proven to be very nice to use. I have not
abandoned Vim, but am doing more JS dev work on VSC.

\- The Django rest framework is super amazing. It just works so well with
Django and allows me to build great APIs without a lot of overhead. I wish
there was something like it for Java.

------
DougWebb
I'd been coding on the side from 12 years old right up through grad school;
many different languages at many different levels. Assembly languages, BASIC,
Pascal, C, C++, Cobol, Forth, Prolog, Java, etc. Through it all I thought I'd
eventually go into robotics where I'd primarily be a Mechanical Engineer
building things, and writing software on the side for tools and controlling my
creations.

Then a friend offered me a software development job that I couldn't turn down,
developing in a language I hadn't used before: Perl. It changed my life. I
could never handle large projects before because it was too much code and too
much hassle to manage it all, but Perl is so good at letting me express what I
want the computer to do that wasn't a problem anymore. Perl allowed me to make
software development my career, instead of just one of the tasks I did as part
of my career.

Later on, I had a similar experience with jQuery. I had been using Javascript
since it first came out, but it was such a hassle to deal with the DOM and
cross-browser issues that it was never worthwhile to do anything important
with Javascript. The maintenance cost was too high. So we added little nice-
to-have enhancements to our webapp, but nothing that had to work. Then jQuery
came along and changed everything. It was suddenly much cheaper to develop
complex and required functionality in javascript, and client-side web
development became a big part of the platform.

~~~
Kaizyn
Have you heard the joke yet about Perl being a write-only language? Have a
look at Python, Ruby or Perl6 for your next change of goto language. One of
those should still fit your thinking style and should ease some of the pain
points of working with Perl.

~~~
DougWebb
That joke's not true at all, if you write your code well. It comes from many
people writing really bad code and sharing it widely through cgi script
archives. Lots of stuff on CPAN was bad too. And of course there was a lot of
intentionally-bad code too.

These days I'm writing C# web apps, with plenty of client-side javascript. My
problems dealing with large complex codebases went away years ago; Perl helped
me to discover that I could do this as a career, but it hasn't been a crutch.

~~~
BeetleB
>That joke's not true at all, if you write your code well. It comes from many
people writing really bad code and sharing it widely through cgi script
archives.

Here's the thing. If I read Perl code written by someone new to Perl, it's
hard to read.

If I read Python code written by someone new to Python, it's easy to read.

You can write good code in almost _any_ language, so yes, of course you can
write readable code in Perl (and I expect experienced Perl programmers write
readable code). With Python, _everyone_ writes readable code (albeit some
people write more readable than others).

Actually, Python is one of the few languages I've come across where the
beginner's code is usually easier to read than an experts (who are more likely
to use more obscure features of the language).

~~~
gkya
Certainly in Python it is easier to read the code, that is find individual
lexemes and say what statements do. But thus does not necessarily mean mean
it's any easier to reason about the algorithm and to say what a series of
statements do. I'd thus rather talk about the readability if individual
snippets and not if a language in general. Certainly there are some languages
which impede the programmer to interpret the program, but Perl is not one of
them.

------
pvdebbe
Clojure, or maybe all these related Rich Hickey talks transformed my attitude
towards systems programming. Before that, the Unix philosophy. But perhaps I
can't say that the Unix philosophy changed my career because I adopted it very
early in my programming and way before any career established.

Sadly, Clojure has left me in a position where Python + Django in my day work
disgusts me with its mutability and unnecessary OO semantics, but I don't have
much choices in my area. Ignorance can be a bliss sometimes!

~~~
TurboHaskal
Clojure has mutability and a lot of its idiomatic abstractions are object
oriented in nature.

~~~
hellofunk
> a lot of its idiomatic abstractions are object oriented in nature

This is a curious comment, and I'd like to hear some elaboration.

I used C++ for years, then 2 years as a full-time Clojure dev, and I don't see
any OO parallels in Clojure at all.

~~~
pvdebbe
A couple comments.

* clojure protocols map to interfaces (abstract classes for C++ folks)

* one can define records that satisfy protocol(s). This is one way to do OO in clojure, happens to map to the underlying JVM mechanisms for JVM optimizations to kick in.

* Gamma et al., Bloch and many others tell to prefer composition over inheritance. Clojure makes this guideline easy to follow.

* overall the OO leaders also recommend making classes "value classes" (everything immutable; smart copy semantics; etc) as often as humanly possible.

* Multimethods allow arbitrary dispatch (most versatile kind of polymorphism) and there is also a faster method when you only want to dispatch by protocols (the (sadly) 'usually' only way to dispatch in most OO languages) that reuses JVM notion of classes and interfaces behind the curtains.

* What you don't get is encapsulation, (and many, a great many authors cite encapsulation to be the definite trait of an OO language,) it can also be argued that immutable values do not need encapsulation per se. A value should be able to stand on its own, convey the semantics it needs & so on..

~~~
hellofunk
> a great many authors cite encapsulation to be the definite trait of an OO
> language

Yes this is what I was referring to, Clojure is not OO in the way that many
think of OO.

But your other points are right on.

~~~
pvdebbe
But what _exactly_ is achieved with information hiding, hmm? :)

Now there forms many schools of opinion, and in many of them it suffices to
have data immutable and value-like, and suddenly it doesn't matter if the
information is hidden into opaque memory addresses or not.

~~~
gkya
You can make sure that no other bits of code depend on that value being
available and thus modify what is internal to the encapsulating unit of code
rather freely.

~~~
hellofunk
You can still do this in functional programming by programming functions that
only interact with their arguments, and limiting what those arguments are.
Additionally, in Clojure, you can in fact hide data by not exporting it from a
namespace and only providing functions that operate on it in the namespace,
and some other FP languages do this also. The difference is that within the
namespace/module, all data is available to all functions, which is often
easier to think about and organize than adding the complexity of marrying
certain data to certain functions.

------
mping
Clojure with emacs+cider. The ability to interact with a "living" system in a
homoiconic language where functional programming allows you to do some neat
stuff was mindblowing. Specially because the LISP guys probably have been
doing this for ages. Think React hot reload on steroids, applied to the whole
app and with an interactive IDE where you can eval any expression and get
immediate feedback, even if the expression interacts with a db (requiring a db
connection) or whatever.

------
dvcrn
Go recently, and Clojure previously.

Clojure forced me to think in a radical different way than I was used to. I
started with massive functions that easily became unreadable, and slowly
adapted purity and wrote side-effect free code. The paradigm shift affected me
so much that even in other languages, I started writing pure code and use
function composition more and more often. Coming from an imperative
background, functional programming was a bit difficult at first to wrap my
head around, but now I love it! (Eventually I even ditched JavaScript for
ClojureScript).

Go recently because it was my first truly compiled, statically typed language
after almost 7 years of working (I know, right?). My entire career consisted
of Python, PHP, JS, Ruby - you get the idea. Go changed that. On top of that,
it is a very biased language that forces it's coding standards on you. Not all
are good but you learn a lot about the design decisions behind them and why
things work in the way they do.

Plus after working with it for a while, even other compiled, statically typed
languages like C++ became a good chunk easier.

And as a extra, very recently: Elixir. Loving functional language, Elixir
taught me erlangs genservers and process manage and oh boy! I don't understand
why that's not the default tool we use for webservers all the time. It just
seems like a natural fit vs other languages. Thanks to supervision trees, it
is very easy to write fault tolerant, highly concurrent applications that span
multiple servers, without the need for extra tools.

For example: You can spin subprocesses up at any point, communicate with them,
kill them, let them crash without fearing that anything else in your
application is affected. When previously you needed a queue server, a cache
server, background workers, service crash recovery, long running requests
processing and more to build a concurrent system, Elixir makes it very easy to
implement these things extremely easily as subprocessed without the need to
leave your application and grab tool X (upstart/cron/rabbitmq). Worried that
something will crash? Just let it crash and the supervisor restarts it.
Worried that the supervisor crashes? Then the supervisor of the supervisor
restarts the supervisor.

Your background worker process is on server 2 and you want to dispatch
something from server 1 from the same mesh? Just use it's PID and let BEAM
handle the rest. Same for Queues, Stores, Caches or anything really.

I am highly convinced that learning Elixir is something every web engineer
should learn.

~~~
mountaineer22
So, what stack would/do you use/recommend? Elixir + Go + ???

~~~
59nadir
There's no need to involve Go in that stack if you're building on Elixir. If
you absolutely need interop with something else it'd be better to go with
something more focused (either on speed, correctness or something else, as Go
doesn't really focus on much of anything, except design-wise) and use it
through ports or the like, from the BEAM.

Go as an addition to a BEAM app won't add anything as it mostly does nothing
much better than the BEAM and what it does better will be better handled by
other languages. Some people would attempt to make a case for it being able to
spawn threads, etc., but its scheduling makes in inherently as incompatible
with the BEAM as any other language, so it's not a reasonable point to make.

------
mamcx
FoxPro.

I credited it for don't fear and be good at use RDBMS. Also, the most
productive dev environment ever.

Python (+Django).

To show me how good syntax and well design API make the difference. Also, I'm
mostly on python after all this years so is my main income generator!

Delphi (until get too expensive and all the inestability...)

What RAD is. I was able to circle around some local competition that waste
time with .NET or others tools. Better than any else for GUI, far better for
DB development that many (except FoxPro, of course).

After the above, is from bad to worse. ALL other dev environments provide sub-
par experience, more dev time, worse at RDBMs development, etc.

\---- iOS.

My main differentiation and second income generator. In my country (Colombia)
the developers are mostly on Android. I'm one of the few that do "native" iOS
development.

\--- F#.

Because is my gateway to the ML family, AGDTs and almost as good as coding in
python, except for the use of type inference.

------
TurboHaskal
Made a lot of money with Pascal, then Perl.

Common Lisp and Haskell turned me into a grumpy, unemployable mess. Terrible
ROI.

I went 180 and now I'm starting to appreciate (and making money with) Go.

~~~
willismichael
Could you clarify what you mean by "grumpy, unemployable mess"? I'm assuming
that you mean that you got a glimpse of what software development could be
like, but didn't find any traction in the industry?

------
welanes
Knowledge-wise: Github. When I began learning Javascript I'd read through the
source code of any libraries that appeared to do magic and figure out what the
trick was. Very helpful in making things 'click'.

Tool-wise: Vue.js (a single file for code, templates and style is refreshing),
Now by zeit.co and Sublime Text are my three hombres.

And hot-reloading, for all those hours it saves me....praise be to Websockets.

~~~
hacker_9
I agree with GitHub, everyone here is talking about programming languages, but
the ability to search through millions of projects and basically get a 'head
start' on any idea you come up with is just brilliant. The other day I needed
a Bezier curve editor and GitHub gave me a 100 to choose from! I just took the
one with the most features and started adding to it from there - saved perhaps
a week of effort right off the bat.

------
JackFr
I'm a Scala dev now, but when I was a Java dev, I went and learned Python,
then Ruby and Rails. Never left Java (well until I got into Scala) but
learning those absolutely changed the way I wrote code, and with respect to
web dev finally gave a clear picture that was near impossible to see in the
Java ecosystem.

(Also using IntelliJ IDEA for the first time in 2002 - opened my eyes as to
what was possible for an IDE, and what was possible to do with Java.)

------
PaulAJ123
Back some time around 1990 it was C++ and SCCS (Source Code Control System).
OO was clearly a major improvement on structured development, and SCCS was my
first version control system. Before that we just had a shared directory and
would announce "I'm editing foo.c".

Then I learned Eiffel. Preconditions, postconditions and invariants, in a
language with garbage collection. This was obviously a big step up from C++,
and I spent the next decade trying to get everyone else to see it too.

As Java took over the world I looked around for the next big thing after OO,
and decided to learn a functional language. Having seen how C++ made a mess of
the structured/OO hybrid I went for the purest language available and learned
Haskell.

So now my hobby language is Haskell, and I'm hoping to make it my professional
language some time. Once you learn Haskell you realise that every type system
in every other language you know was designed by someone who didn't understand
what they were doing. You are also finally cut free from the Von-Neumann
architecture, so you can pick whatever form of computation best fits the
problem you are trying to solve at the time.

------
aloisdg
C# + Visual Studio (2010 back then). I used to code in PSPad (Webdev, Python),
then Emacs (C, Shell, Python). When I discovered VS with its debugger and C#
with all the sugar, I was changed. I never stop using them since.

------
k__
Coming from PHP (did it from 2006-2011) JavaScript blew my mind.

Most of the time I saw it as a tool to use, when CSS wasn't powerfull enough.

After using NodeJS I was blewn away. NPM alone was a killer feature PHP was
missing.

Functions as objects that can be passed around and closures introduced me to
functional programming.

I really thought PHP would go downhill after I saw the whole JavaScript hype
and switched 100% away from PHP. Many web-companies here in Germany were just
doing Java or PHP at that time (before 2010) and if you didn't know about one
of those two languages you were screwed, but now I do 100% JavaScript
development AND get better projects than with PHP. But I have to admit
Facebook pumping money into PHP helped tremendously to make it better.

At the moment I have smaller WOW-moments with TypeScript, RxJS and NixOS.
Smaller basically because I don't have work-related projects at the moment to
use them, but they seem to fix a few pain points I had with JavaScript,
React/Redux and Vagrant. (undefineds everywhere, realtime-data stream control
and sane dependency management)

------
carrigan
Arduino. I went to school for Electrical Engineering and learned programming
for small embedded computers using assembly. While assembly can be fun as an
optimization puzzle, it takes a very long time to code even a simple project.
Additionally, these computers can have 1000+ page datasheets that you need to
comb through in order to set their peripherals up.

Arduino takes care of setting up the peripherals, gives easy to use functions
to control the chip, and hands over the keys to a fully ready C++ build chain.
When I finished my first project I was hooked and tried to use them everywhere
I could for prototyping, and always aimed to make my hardware libraries as
easy to use as Arduino.

~~~
ChristianGeek
Every software developer owes it to themselves to pick up an Arduino and
experience the sheer joy of writing simple software to control basic hardware
(or more advanced software to control more advanced hardware once you get
hooked).

------
unoti
My biggest oh wow moment came from learning Erlang. At first I had trouble
adapting to its functional style and punctuation, so I gave up. Later when
reading a book about another functional language (Scala) the concepts fell
into place. The way Erlang works from a language and platform perspective
changed the way I think about constructing both programs and systems as a
whole.

Today the learning process is far better and smoother using Elixir and
Phoenix. Jump in and give it a try!

------
mherrmann
Python, hands down. After 10 years of other languages (mostly Java) it opened
my eyes to how simple programming can be.

------
reustle
A lot of these answers give technical reasons, but career wise it is a
different answer for me.

JavaScript. Once I got a solid understanding, the ability to do so much more
visually and interactively on our own projects, bookmarklets and chrome
extensions for sales / business department, etc, that was when they really
started to notice my value at my first tech job. They felt like I was a
wizard, able to modify the features of almost any existing web tool they used.

------
chubot
Learning Python (in 2003). I use 5 different languages regularly and I've
tried a half dozen more. I've worked in quite a few parts of the industry.
Python seems to be the bread and butter -- it gets things done quickly and
reliably in so many areas.

------
fsloth
The biggest impacts on my professional thinking were caused by learning Ocaml
and F#. Those impacted greatly the way I approach systems design and
programming in general. The second biggest impact was probably learning Scheme
and writing a scheme interpreter.

------
cr0sh
Gonna keep this short.

My biggest moment was when I finally learned and understood how artificial
neural networks (ANNs) - and specifically back-propagation - actually worked.

It happened in the fall of 2011 - I took on the challenge of the Stanford
University sponsored AI Class (Thrun, et al) and ML Class (Andrew Ng). I
wasn't able to complete the AI Class due to personal issues, but I did
complete the ML Class. In 2012 I took Udacity's CS 373 Self-Driving Vehicle
course (and completed it) to "make up" missing the rest of the AI Class.

But it was the ML Class that really drove things home; learning and using
Octave was a revelation for me (vectors as a primitive? COOL!) - and learning
to think on how to parallelize problems for that (and then later learning that
an ANN was just such an application) - woke up a lot in me. Finally - a
practical use for a home Beowulf cluster!

These experiences have led me to this year, where starting on November 28th,
I'll be participating in Udacity's Self-Driving Car Engineer nanodegree
program. I believe that as we move forward in the future as software
engineers, knowing and understanding ML and AI algorithms, etc will be
something employers will increasingly want and expect of developers. I'm
keeping my skills current - you should too.

/43 years old, been professionally coding since I was 18 - and coding in some
manner or another since I was 11 (yep - TRS-80 Color Computer w/ 16k FTW!)

------
cel1ne
Tachyons.css: [http://tachyons.io/](http://tachyons.io/)

Suddenly CSS became fun again and my time designing websites went down by a
guessed factor of 5.

~~~
Kiro
What happens when your boss all of a sudden wants to change all the colors
from blue to red?

~~~
1_player
I have the same problem, and I've yet to find an acceptable solution.

Another problem I've encountered: functional CSS (such as Tachyons) is only
good for minimal layout. I was recently converting a mobile+tablet+desktop PSD
design to CSS with very complicated reordering rules (this <div> is full
height on the right on desktop, floated bottom of the page on tablet, etc.)
and all my elements had 20+ classes attached to them.

So I went back and converted regular 60+ lines of CSS. Still, for some reason,
working with Tachyons was for some reason faster and "easier" to reason about.

I think it's a step in the right direction, but we're not there yet.

------
contingencies
Tools: Linux. IP. IRC. SMTP. HTTP. Wikipedia. SQL. RCS/VCS. Travel.

'Wow' moments: Working in a small publicly listed company early in my career
showed me how inefficient and corrupt the stock market is, gave me a brief
general education in business, and showed me a lot about the nature of
international business. Travel showed me how there was an alternative to
decades of 9-5 work, that I had nothing to fear from failure, and that I could
actually afford to start my own companies. Starting my first company from
concept to break-even revenue was a great learning curve.

Best decision: Moving to China. It gave me the opportunity to start a company
and learn loads very quickly.

------
jtreminio
Hashicorp products. It's incredible how productive this company is, and how
much I've come to use their applications throughout my career.

First Vagrant, then Packer, then Consul, and soon Vault and Terraform.
Everything I've been wanting to do for years, I am now doing thanks to
Hashicorp.

~~~
amingilani
Hey! Okay, this might be the best coincidence I've ever seen. I'm a random guy
on the internet that thinks Vault looks awesome and I want to use it for my
next project, but I'm having trouble since the documentation is so sparse and
thin.

Do you mind helping me out for some good Karma? Check your twitter! :D

~~~
jtreminio
Join us on freenode #vault-tool

~~~
amingilani
There's a whole freenode community? My mind is blown. Coming right away.

------
cbmueller
For me: [https://d3js.org/](https://d3js.org/) Once i learned how to use d3 i
was like: This is what i want to do.

~~~
animesh
+1 for d3.js and the sentiment.

After about a year of using highcharts, for a specific custom chart project, I
was given the opportunity to learn and implement it in d3. I built my first
line chart by hand which took me little more than a week and then the custom
chart project in about two weeks. It was definitely the most exciting project
I have worked on so far.

Learning d3.js also made me rethink my 'use javascript as necessary' policy. I
also came to appreciate what other charts libraries like highcharts do, but I
won't be using those other libraries anytime soon if I can help it.

------
txprog
Kivy ([https://kivy.org](https://kivy.org)) changed my career too. I make now
a living mostly due to this project :)

~~~
tluyben2
What do you make a living with? I like Kivy but my clients would hang me from
a tall tree if I would use it for actual projects because it feels very non-
native.

------
alexmorenodev
Shell made me a lot more agile to do various simple tasks which would take me
time for repetition.

Learn a text editor deeply (Sublime) made me extremely faster than all my
colleagues.

I, as an addicted to efficiency, found my job a lot funnier everytime I learn
something that makes my common task less time consuming.

------
bastih
For me that was Smalltalk. The environment, the tooling, the purity of the
language. Not saying everything is great there, but it's pretty great once you
get used to it.

Seaside as a completely different approach on how to develop web applications
which turns your thinking upside down when you are used to a typical request-
response workflow.

Django as a godsaint after working on a medium-sized pure-php project without
any clear structuring.

------
protomyth
NeXTSTEP 3.3 changed my whole way of thinking. It was an amazing development
environment with a separate interface builder that allowed me to spend a lot
of time just thinking about the best way to do things. Objective-C is still
one of my favorite languages. It was also my first BSD experience and lead me
to FreeBSD and then OpenBSD. The difference between Objective-C / NeXTSTEP or
Cocoa and C++ / WIN32 was amazing.

Forth also made me go "wow". I really understood that way of thinking. I also
think Forth is amazing for its ability to keep you from getting discouraged by
allowing a problem to be broken down into new words. Postscript was my Forth
"wow" combined with art.

------
mikestew
FoxPro for Unix. The FoxPro part is what kept a thriving consultancy going for
years (which we sold before...). The Unix part is how I ended up at Microsoft,
ironically (in the 90s) because I knew Unix and a hefty helping of FoxPro
knowledge didn't hurt.

I haven't touched FoxPro in over ten years and work primarily on mobile now.
But a stint at Microsoft opened up all kinds of opportunity, and that wouldn't
have happened were it not for a small company in Toledo, OH cranking out
desktop database software. Otherwise I'd probably still be in Indianapolis
cranking out CRUD for some insurance company.

~~~
ljw1001
Foxpro was my first language and I loved it.

------
petercooper
Ruby and Rails in 2004. I'd been a Perl developer for 8 years till that point
but had basically given up on building anything substantial with it and was
transitioning to being a freelance writer. Ruby and Rails got me straight back
onto the development track and had a huge influence over my successes since.

~~~
sleight42
2006 for me after 9 years of Java and a few of C, C++, and a smattering of
PERL and Python. Rails, and then Ruby, were such a breath of fresh air after
the verbose hell of Java, J2EE, and Spring.

------
cx1000
\- making gdb user friendly with this .gdbinit file:
[https://github.com/cyrus-and/gdb-dashboard](https://github.com/cyrus-and/gdb-
dashboard)

\- fabric, the python library:
[https://www.digitalocean.com/community/tutorials/how-to-
use-...](https://www.digitalocean.com/community/tutorials/how-to-use-fabric-
to-automate-administration-tasks-and-deployments)

\- sublime text package manager

------
macca321
Building (certain) applications using in-memory persistent objects instead of
using a stateless web app + database server, somewhat similar to a multiplayer
game.

Made programming fun again. Don't seem to get to use it at client sites as
it's too extreme an approach :(

~~~
Kexoth
Have you tried Elixir?

Please have a look at the following presentation. I was also interested in the
same, watched this presentation[0] & many other, made some prototypes by
myself & I'm still amazed by OTP/Elixir & Phoenix later on.

[0] - [https://vimeo.com/171317253](https://vimeo.com/171317253)

~~~
macca321
I'll take a look when I get a chance - from a glance at the Phoenix docs looks
it like a railsy MVC framework though?

The pattern I'm talking about is dicussed here:
[https://news.ycombinator.com/item?id=2945513](https://news.ycombinator.com/item?id=2945513)

------
tootie
When I realized language and framework choice have at best a marginal
influence on product success and started focussing on identifying the right
problems and getting to a solution quickly without letting developers get
distracted by superficial decisions.

------
hellofunk
Definitely Clojure, both server and browser (clojurescript), and also using
React from Clojurescript (Om). These in combination gave me a big new glimpse
into the wide variety of expressivity among languages, and how UI development
can be significantly streamlined.

I don't use Clojure as much any more but everything I learned has had a
lasting impact and much of it trickles into my other work now, in other
languages (mainly C++).

------
mikeleeorg
JavaScript.

This is way back in 1998, when there was still VBScript and JavaScript was
still very nascent. I had no idea it would have the impact it has had on the
Web today. I just found it a cool way to make rollovers and other effects.

When CSS and "DHTML" came around, its potential was starting to dawn on me.
Others saw it first, but that was when I started to approach it in earnest.

I created and played with so many cross-browser JavaScript libraries in that
day. (Anyone remember 5k?) This is way before jQuery. Even made a bunch of
widget libraries. Looking back, it was such a Wild West. Arguably, it still
is.

Somewhere around 2003-2005, a bunch of colleagues and I started to apply
formal computer science discipline and principals to JavaScript. Many others
were trying similar things too. I even remember using an iframe to dynamically
load and change content on the page without a refresh, a precursor to "AJAX"
when it was coined in 2005. Somewhere around this time, I remember colleagues
talking about using JavaScript on the server too, instead of just the client.

It's pretty crazy to see how far this little scripting language running on a
Netscape browser has come.

------
sbalea
Erlang. I used to be a C/Java kind of guy with a little bit of C++ and PHP
sprinkled in. Got tired of using GDB to rummage through core dumps in order to
figure out C/pthreads concurrency bugs. So looked into this new fangled thing
called Erlang that came with this weird programming model called "functional
programming". Boy I was hooked.

Fast forward 7 years and a couple of increasingly lucrative and interesting
jobs...

Scala. Getting a bit bored with the Erlang ecosystem, got offered an (even
more interesting and lucrative) opportunity at yet another startup, that was
running on Scala/Akka/Reactive Streams. Jumped at the chance and went through
what was probably the most grueling 6 months learning curve I've ever been
through. Got to appreciate the benefits of a strong type system and a
thoroughly modern/flexible language. Also gained a renewed appreciation for
the simplicity and practicality of Erlang and it's virtual machine :)

That's where I am now. What comes next, I am not sure. Maybe Haskell or
Clojure. In any case, after all this it feels like I could handle anything
anyone throws at me.

------
synthmeat
Combo of vim+tmux+tmuxinator.

I work on many projects with many different modules, languages, databases...
What this enables me is to be one single command and a seconds away from
completely switching context while still maintaining basically identical
environment. It encourages experimentation because you're language/project
agnostic and it reduces friction to getting started which is a great boon for
productivity.

------
cutler
Clojure and Rich Hickey's sermons from the Mount. Absolutely game-changing.

------
knz
PostGIS.

I'd messed with some of the ESRI server products and knew basic SQL but
discovering PostGIS was a paradigm shift in terms of being able to easily and
efficiently run more advanced spatial analysis in a database.

------
vintagedave
For me it was Delphi. This was in the nineties and it was a beautiful language
paired with a UI editor in a time when that didn't exist (there was only VB
(ugh) or MFC, if that really counts as a UI designer.) It had a huge influence
on languages, especially C#, which feels like Delphi-with-braces to many
Delphi programmers. For me as a teenager, it was when I "got" OO programming
and set me off on a programming career, which led to many adventures (sailing,
natural disasters, etc.)

I came back to it quite recently and it's advanced a lot, although I use its
C++ sister product, C++Builder, which pairs the same UI tech with C++, a trick
that is hard to pull off (Qt manages it, through many clever C++ tricks;
C++Builder does it through a couple of neat language extensions which I feel
is cleaner overall. I really like it. This year I started working at the
company making it, so full disclosure there, but I work there because I like
the tech so much.)

------
Vanit
I don't know if it was career changing, but NodeJS blew my mind when at the
time our company was using a lot of PHP cron jobs.

~~~
mirceasoaica
Same thing happened to us. We moved a lot of cron logic to nodejs and we were
able to increase speed and reduce hardware costs.

------
facorreia
Turbo Pascal for CP/M, and later for MS-DOS. It empowered me to develop
business process automation software and jump-started my early career -- I
moved away from older tools like COBOL.

------
ilaksh
Wow moment for me was finding out about Nim which proved once-and-for-all for
me that the idea of performance vs. code clarity/convenience having to be a
trade-off was a fallacy.

~~~
nimmer
Same here. We've been wrong about the idea of trade-off all this time.

------
xamlhacker
Ocaml, F# for programming languages and ZeroMQ in terms of libraries. And
recently HTC Vive in terms of hardware.

~~~
steinwaywhw
Are you using F# it at work?

------
doweig
Elasticsearch + Kibana.

First it was a weekend project, then a full project at work, now there is a
full team working on it and my title has changed to "Data analyst".

All in 6 months.

~~~
desarun
upday?

------
bocata_chorizo
For me it was JavaScript.

I learned C and C++ in university. It was all either procedural or object-
oriented.

JavaScript made things a lot simpler, especially first class functions and
higher order functions. It delighted me that you can just pass the function
like it's a variable instead of messing with pointers. It's also delightful
that a normal function can return an object. No constructors, instantiation,
hierarchies, complications. Just spit out the object. It's simple!

Lodash's "chain" was my gateway into functional programming. I am avoiding
getting too deep into that because it feels kinda cultish the way adherents
claim its superiority, but it has nevertheless impacted the way I approach
problems.

------
Hyperized
Ansible. and maybe Puppet a bit. They allowed me to scale with my career.
Going from a few hand-managed servers to 100k+ environments at ease.

------
antaviana
\- Turbo Pascal when I was programming in RPG II \- Delphi when I was
programming in Turbo Pascal \- AWS

------
willthames
Ansible - I first discovered it from a comment here, thought 'who needs a new
config management tool' then realised Michael Dehaan had also written cobbler
so thought it was worth a crack. Since then my python skills have improved
through reading and improving the ansible code base, I've written ansible-
lint, ansible-inventory-grapher and ansible-review, and I've been on two long
distance conference trips as a result.

------
gowthamsadasiva
It's "Docker" that changed my career and I still believe it has the capability
and growth to change my career further too.

When I landed my first job back in 2012, I used to be a PHP developer. As
obvious, working in a startup will force you to be a jack-of-all-trades, I
started picking up SysOps (Linux, Web Servers, Email Servers, Deployment..etc)
tasks along PHP development.

In mid 2013, I stumbled up-on "Docker" and I started learning it immediately.
Mostly, I used it to solve dependency and packaging issues for my PHP
projects. Soon I became fluent in SysOps tasks too.

Early 2014, I wanted to get into a new job. But not sure to continue as a
developer or get in-to DevOps. Instead of doing the same old boring
development, I chose to be a DevOps and the opportunity was provided because I
have working knowledge in "Docker", which is not an easy find at that point of
time. Actually I got a pile of opportunities and landed in the best among
them. After 2 years passed by now I'm at my third job in a different startup,
which again I work mostly with Docker.

By looking at the Docker's growth and usability, I could even say, it's gonna
get my future job also :)

------
belvoran
My wow moment was when I first found out something totally different than my
comfort zone. It was SQL then. But it was 15 years ago.

Another wow moment was Perl, and its just three data types.

Then lisp.

Currently I think that the most mind changing languages for me were SQL, and
C++. I don't know why, I just love Postgres, and I love the C++ speed.

However for the last 15 years I've been commercially programming in C, C++,
Java, Javascript, Python, Ruby, Perl, Delphi, PHP, SQL.

What I like is different: I like Python, Postgres, SQL, Java, and I'm learning
currently is the newest C++, and a little bit of Rust.

I'm not sure why I still have problems with understanding Haskell.

However when I'm looking for a remote job now, all that doesn't matter. I get
some strange interviews with 10 minute algorithm tasks (if you don't remember
the implementation of this task, which you have never seen before, you have no
chance to write it). Or even recruiters not understanding the answers to
technical questions they ask.

And most of the job offers I get require 10 years of writing in one language,
so I'm wondering if I did good learning all those different things.

------
gotofritz
Well I go way back, for me the first time it was PERL for web programming,
that lovely write-only language.

The biggest one though was Javascript when Netscape first invented it.
Suddenly FE development went from HTML without even CSS to actual programming,
and one could see the potential of the platform.

Then ActionScript 2, which was the short lived phase of Flash where it evolved
from a vector toy for making spinning logos into a JS-like language (they were
in the ECMA committee and everything), but you could do all sort of crazy
animation and sound too. Sadly ActionScript 3 and Flex ruined it all for me,
turning Flash into Java. But it was fun while it lasted.

Luckily by then JS was reborn thanks to jQuery et al, and the next "wow"
moment were all the APIs known collectively as "HTML 5" \- from WebAudio to
WebSockets to Canvas etc.

And finally ES6 / WebPack and React / Flux, finally we could break away from
the MVC model that never sat well within a browser environment, and with a
modern language to boost.

------
moron4hire
I have been a "general purpose" developer (I hate saying "full stack", because
there are no stacks and I don't always work exclusively cross-disciplinary).
Mostly web-focused, but I've done stints where I was 100% SQL or 100% desktop.
There was even a brief period where I was exclusively doing embedded C. I've
done JavaScript since it was invented. I've done C# since it was invented.

In that time, I've never been quite as excited about anything as I am about
Virtual Reality, and specifically what Google and Mozilla are doing with
WebVR. I don't think people understand how much 2D systems are holding us
back. We've had the same WIMP interfaces since Xerox invented them in 1980.
And we largely do the same things with our computers as we did in the 90s when
the GUI finally captured majority market share. Making computers smaller and
faster is not going to change that. Only a complete change in the user
interface will change that.

I've always banged around working on graphics, stereo-imagery, and simulation
as a hobby, but I seriously started on making something about 2 years ago
(actually, I recently saw my first commit for some reason, and it was July 10,
2014). When my son was born prematurely earlier this year, it lit a fire under
my ass. I know a lot of people think that they need to get the startup stuff
out of the way before they start a family, but for me, my family is my
purpose, my family is what drives me. I feel strongly that well-designed VR
systems are going to enable a whole new level of accessibility,
interconnectedness, empathy, and collaboration. I need to make that world for
my son.

So because of the stuff I started 2 years ago, I now have a job where I spend
100% of my time working on VR. For the first time in my entire career, I look
forward to going to work. I feel great. I have great coworkers. We do amazing
things together. And it's because of WebVR.

------
fatboy10174
I Started with vb.net, and then quickly tranisitioned to C# at the advice of a
manager about 12 years ago, naturally incorporating javascript and HTML and
i've never looked back since. I had an 'wow' type of moment when i discovered
MVVM (Knockout) and decided to bite the bullet and actually learn jquery.

------
cableshaft
Flash. Without it's awesome graphics, animation, and sound integrated with
programming and its awesome community at the time, I might not have even
gotten back into programming, as I had taken a two year break from it at the
time after a rough college computer science experience with terrible
professors.

------
andretti1977
Java changed my (professional!) life. In 1999 i was able to develop desktop
applications for both windows and linux without (too much) pain thanks to the
JVM. It was love at first sight. After graduating i started developing web
applications, always in java and it was very cool.

Six years ago i started developing android mobile apps, always in java! So
java was my love and game changing language and i still use it today for both
web and mobile projects (Spring is a beautiful and easy to work with web
framework).

During all these years i have become a proficient developer also with groovy
(Grails was great, but sloooow and little adopted), with objective-c
developing iOS apps, php and javascript so i agree with who said that it is
fundamental to learn different languages, but my favorite one is still JAVA,
even today!

------
FascinatedBox
When I decided to build my own programming language. I had a handful of
smaller projects under my belt beforehand. Before that, I had never thought
much about what goes into the design of a language, and how important that
decisions are (as well as the interactions different parts can have).

------
p333347
I have been a C++ dev for all my career (about 14 years), so JavaScript was
pretty cool relatively speaking. For various reasons I had been a Luddite of
sorts and late to the webapp party. But when I finally got in, (more like
circumstances left me no choice, technically not financially or socially) mid
2015, I was amazed at the influx of ideas I had. I mean, not only am I porting
my desktop apps to web, I am also tinkering with ideas that never made sense
desktopically so had never occurred to me. I have to admit that JS was a PITA,
albeit of a different kind from C++, but it has certainly made me more
confident and viable in starting my own thing. (For those who care, the front
end is in Vanilla JS and for back end I am planning ASP.NET and WebAPI.)

------
IndianAstronaut
R. Until I learned R, I really never was able to do statistics and machine
learning on the datasets I was given. Python just didn't cut it since it had
minimal statistics compared to R and scikit learn wasn't able to fully handle
a lot of the missing data problems I had.

------
DanielBMarkham
A couple of things:

C/C++ -- learning C/C++ took me from being a backyard hacker who could figure
out stuff to being somebody that could code close to the metal. It helped me
understand how all other languages worked.

Javascript -- I really hate Javascript, even though I've been coding with it
since it came out. But learning it gave me a front-row seat to watch the world
evolve

F# -- I wanted to learn FP and started with OCAML, moving to F#. Combined with
lean startup principles, F# and pure FP showed me just how much time I had
been spending fighting the tools instead of just delivering a solution.
Changed the entire way I look at programming.

------
rwmj
Miranda[1] The language itself is a toy teaching language (and not even freely
licensed), but it's so beautifully elegant - like writing mathematics - and it
was a way in to ML and Haskell and other functional programming. In fact to do
my homework I had to write a Miranda to Haskell translator so I could run the
homework exercises on Linux.

[1]
[https://en.wikipedia.org/wiki/Miranda_(programming_language)](https://en.wikipedia.org/wiki/Miranda_\(programming_language\))

------
webmaven
Zope in 1998 was a complete game-changer.

~~~
tluyben2
Wow that brings back memories. Is that still used/supported?

~~~
jcbrand
Yes, the Plone CMS still runs on Zope2. [https://plone.com](https://plone.com)

The ZODB (Zope Object Database) is also still going strong:
[http://www.zodb.org](http://www.zodb.org)

~~~
webmaven
Worth noting here for folks that aren't familiar with Plone that compared to
more popular CMS systems like Drupal, Joomla, or Wordpress, Plone's security
record is rock solid (in fact, the _best_ security record of _any_ popular
Open Source CMS) and is an excellent choice for Intranets and Extranets.

ZODB is also the underlying technology of the recently launched ZeroDB, an e2e
encrypted NoSQL DB:
[https://opensource.zerodb.com/](https://opensource.zerodb.com/)

------
dvd-darias
-> ssh + bash

Being able to fully control a remote computer as if i were in front of it is a
most.

-> git

The distributed nature of git still amazes me.

-> multiple cursors & fuzzy search

Sublime Text pioneered multiple cursors and fuzzy search over all the options
of the text editor, now most modern editors have included it. I use Visual
Studio Code btw.

-> docker

Web development, deployment and configuration have been vastly simplified with
this open source project.

-> NoSQL databases, in particular MONGO DB

My view of data fits way better with non relational databases, and not having
to deal with migrations is a gift.

------
davidspiess
React & redux. Through redux i came in touch with functional programming.
During the first week learning it, i came home from work exhausted and with a
headache but eventually it clicked and i was amazed how productive and bugfree
further development was. I began to adapt the functional style in my PHP
projects and started using real functional programming languages (Elixir and
F#) to take my understanding even further. Still plenty to learn.

------
131hn
PHP developper since +10 years, I learned little by little client side Js
through Mootools (object programming 5 y ago). I started nodejs 0.10 2y ago
and got a serius wow when i realised node 4 & generators & tj/co could
efficiently replace line-per-line how i used to work in PHP (async-co, pg-co)
with so much more power (browserify, mocha, istanbul, npm, ...). I guess today
the switch is complete for me

------
coygui
Nobody mentions RUST? I thought it,s popular here...

~~~
Tomte
Rust is extremely new, with way fewer people who have tried it. So there
wasn't much opportunity to change someone's career (both on the time and the
people axis).

Additionally, Rust is a very well-engineered language, but it has few ground-
breaking attributes. The borrow checker has never appeared in a non-esoteric
language before, I guess. Most of the other goodies could have blown people's
minds long before in another language.

~~~
dochtman
I think the borrow checker is actually pretty mind-blowing. In general, I'd
say that the combination of modern language features with a real systems
target (i.e. low-level, no GC) certainly has the potential to be game
changing, in the sense of making it that much less scary to write things in a
systems language.

------
maxencecornet
Meteor made me way productive

------
misterioss
Intellij IDEA <3

~~~
AnimalMuppet
Seconded. It was like being psychic - the code just appeared on the screen.
Amazingly fast and productive.

Before that ( _way_ before), telnet and ftp. Being able to deliver a new
executable to personnel at a trade show floor from 500 miles away was mind-
blowing in the early 90s...

------
gpsgay
Honestly? PHP hehhehee. PHP is a language that works for people who want to
get things done on the internet in a very uncomplicated way :P... Plus, it is
also quite powerful if you actually go into detail and access low level things
as well. I hated Java for example... But PHP.. Oh, you can programme such
wonderful things with just a text editor.

------
internobody
If not for Ruby/Ruby on Rails I'd still be doing support in Windows land, and
not building fun and cool anything.

------
zubairq
Ruby, then Erlang, but most of all, Clojure!

------
kamalkishor1991
Trying out competitive programming really improved my coding ability in any
programming language. Recently I tried out Ruby on Rails which blows my mind
and changed my view about frameworks(It is really 10 times faster then java to
create a web app). Previously I had written web apps in java and node js.

------
NumberCruncher
English and German. I need the former to read documentations for being up to
date and the latter to communicate with people who can pay me a decent salary.
I can pick up any programming language I need but a third foreign language? At
my age it could be pretty hard and time consuming.

------
pmontra
Rails circa 2006. I could develop a full web app in days or weeks instead of
weeks or months with Java.

------
ergo14
For me it was Pyramid+SqlAlchemy - For me probably best python web framework
if you want something more than CMS.

On frontend I think Polymer and Web Components are a game changer - very low
entry barrier and they feel like a proper way to do web development where
everything is encapsulated.

------
reacweb
Perl in 1998. When the purpose is not the program, but the result of the
execution of the program, it is important to code fast. With perl, you code
like you think. Autovivification keeps your code concise and easy to write.
The syntax invites you to check for errors.

------
codewritinfool
Borland Delphi. Beautiful IDE, native code output with no runtimes, lightning
fast compiler.

------
enapupe
React + ES6 imports = wow + peace I got my first bucks as a developer more
than 10 years ago. Only recently I felt like I have an actual good code
structure. Having components and managing dependencies with es6 imports is
truly awesome.

------
brooklyndude
Firebase. AWS. S3.

------
ceder
expect, TCL and DejaGNU. My first consultancy work assignment: "Paul had to go
on an extended vacation. Nobody understands his code, but he says it is almost
done. Finish it up, please!" Thanks to DejaGnu and expect, I could write an
extensive testsuite, get good test coverage, fix the few missing pieces of
code, and deliver a bugfree product in less than the allotted time. (Of
course, I'm not sure it was bugfree, but nobody found a single bug in the next
couple of years.)

Then Python, where I understood that a language doesn't have to be as toylike
as TCL to be extensible and embeddable.

------
wastedhours
Moving from PHP to Rails in 08/09\. First dabble with MVC and it really
changed the game for me - and the gem ecosystem made things (at least
_feel_...) a lot less hacky than taking random scripts from Google.

------
galfarragem
It would be cool if HN had kind of auto TLDR tool. The sentiment seems to be:

PHP, JAVA -> RAILS, PYTHON, JS

PERL (1998)

LISPS, ML family, SCALA, GO, RUST

EMACS

GITHUB

~~~
SuperKlaus
And Clojure.

------
AtheistOfFail
Pow and Powder for Rails Development.

Pow allows you to link an app to open it as [http://app-name.dev](http://app-
name.dev)

Powder is a rails gem that automates the process for you.

------
kaspermarstal
SimpleITK. Hands down the best medical image processing library ever.

------
vmorgulis
Rasmus Lerdorf about PHP Frameworks:
[https://www.youtube.com/watch?v=DuB6UjEsY_Y](https://www.youtube.com/watch?v=DuB6UjEsY_Y)

------
verdverm
Golang - turned 30k C into 8k lines of Go, no more gdb.

Docker and containers for packaging, shipping, and sharing.

Kubernetes because it fundamentally changes the way we design and build
systems.

ML (and now Cozmo+RL) cause future.

------
Beltiras
Functions as first class citizens in Python. I knew that you could pass
function pointers as parameters in C but there was something so foreign and
new about it.

------
valw
After about 8 years of Java only, JavaScript. Then Clojure.

------
coldcode
Turbo Pascal 1.0 in 1983. First real IDE, fast as hell even on a IBM PC/XT of
the day. It taught me the importance of fast build/test cycles.

------
xophishox
Terraform and Ansible so far have been insanely helpful additions to my
infrastructure management tools. Actually, they are my only tools almost now.

------
martiuk
It's not exactly a language but learning puppet has opened up a lot more
opportunities for me recently and is what pushed me into contracting.

------
NickHodges0702
Delphi. By a mile. I had dabbled in Turbo Pascal for Windows, but Delphi was,
and still is, the thing that gets me up in the morning.

------
ivanceras
From Php to Java and now Rust. Though rust is not prominent yet, I'm sure I
will have a lot of fun when it would go mainstream.

------
lkleen
for C++ development: The usage of tracing tools like windows performance
analyzer or instruments. windows crash/freeze dump analyzer. malloc guard or
application verifier to find memory acess violations. Theese tools are often
very helpful and speeds up our work to find the culprits for the really hard
cases.

------
usgroup
Picolisp because:

Lisp

Prolog

Tightly coupled, distributed DB queried with prolog

Tightly coupled UI engine

Everything under emacs

------
mightybyte
~20 years ago: Vim

Seven years ago: Haskell

A year and a half ago: Reflex FRP with GHCJS

These three events dwarf everything else in my experience.

------
cutler
Django faster than raw PHP or Phalcon. I find that hard to believe. Are we
talking PHP7?

~~~
mirceasoaica
I didn't do a benchmark. Phalcon is probably faster than Django (by a few
miliseconds) but it is a compiled extension and also doesn't have all the
functionality that Django has.

Django compared to Laravel (which is now probably the most popular PHP
framework) is orders of magnitude faster. This is what I meant with Django
being faster that PHP (this statement compares a framework with a programming
language - not fair)

~~~
cutler
Without a benchmark I remain unconvinced. PHP7 performance was shown to have
doubled since 5.6 in most cases, including with frameworks like Laravel. Prior
to PHP7 it wasn't noticeably slower than Python.

------
andrei_says_
Slim, never writing HTML again.

------
pheon
Verilog its like going from 2D -> 4D

And thats for real complex projects, not making LED`s blnik.

------
vsipuli
Linux and Emacs, circa 1997.

------
optionalparens
Lisp - It was one of my first few languages, but really learning it damaged my
view of everything else. To use a real Lisp machine, Lisp
debugging/backtracing, and have code as data was such a huge win over writing
ASM, C, Fortran, and the many other languages I used a lot back then. I still
feel almost all other languages are catching up, while Common Lisp itself I
felt got ruined by a lot of nonsense even though I still use it sometimes. So
both excitement and disappointment here. This is where I really learned to use
functional programming and became productive. All of my code since, even in
OOP takes things I learned here like data first, preferring operations on
lists/sets of data, and meta-programming. This is also where I learned that
syntax really doesn't matter and people while they might have preferences,
they are generally too caught up on syntax for the sake of it and not what it
can do for you (ex: code is data, macros).

Smalltalk - Some of the best ideas in CS that were warped, misunderstood, or
ignored. Commercialism at its finest killed this and ruined the ideas from it.
The productivity in this language was huge for me and the environment was and
still is a wow. The aesthetics have almost always been awful though so it
really bugged me that no one ever gave a practical instead of theoretical
effort to improve here. The day I saw things like Gemstone Smalltalk dumping
entire running states into a bug tracker and then clicking on the issue and
being thrown into the debugger was one of many incredible moments. A lot could
be improved, but like Lisp, lots of imitators and few equals. In terms of
impact, this really led to me truly learning OOP at a higher level and made me
think about code entirely differently - as a living, breathing, environment
that was somehow more real than what Lisp offered. The separations from the OS
into its own world made it both incredible (I still feel like using files
1-to-1 for code is nonsense) and a pain to use (ex: integrating proper source
control and existing tools because of files issue).

Clojure - Finally a practical Lisp-like experience that I don't feel like a
crazy person trying to "sell" to coworkers to use on a project. Lots of things
here I don't like, but even the author of the language agrees with me on most
of those. I like the pragmatism, honesty, openness about what is good/sucks,
and more here. It's really productive for me and I feel less in Smalltalk and
Lisp land. The moment was like, "Rich Hickey, OK, this guy totally gets it."

Emacs - I hated it at first, but when the concepts started to sink in for me,
it made so much sense. Licensing and politics aside, it's pretty incredible. I
wish there was less crust or a way to magically rewrite it and have all the
good add-ons also magically rewritten. It truly is its own OS for better or
worse like Smalltalk, and can be used and abused accordingly. It just still
makes so much sense to me in both Smalltalk and Emacs that I'm writing code
and I can use code to do things to my editor, both in terms of add-ons and
while it is running (ex: if I need a special toolbar, window setup, whatever).

Acme - It's an ugly editor, but wow it's full of great ideas. I didn't
particularly enjoy the mouse chording but everything else is amazing. The
relationships it had with the system using it in Plan9 just made it so
powerful and full of possibilities.

Overall, my best decision to improve my work was to stop listening to the
masses and just try to do my own thing, with confidence. That doesn't mean
just anything, rather it means follow my instincts and balance things with a
healthy dose of pragmatism and extreme skepticism. That also meant ruling out
new and shiny things as well as old and awesome things like Smalltalk and Lisp
on many projects. Once I learned the difference of being a contrarian vs. an
educated independent thinker, I became both tormented by how terrible most
software is and encouraged to think completely differently and abstractly
about it all. Still trying to do some great things with that attitude, and
it's more the non-technical daily life struggles that are the real challenge.

~~~
petagonoral
>Lots of things here I don't like, but even the author of the language agrees
with me on most of those.

Working with Clojure..would be great if you could expand on these. Curious as
to what they are/Rich agrees with.

I find Clojure lacking when it comes to debuggabililty. In so far as everyone
in my medium-ish non trivial codebase seems to find 'clever' solutions that
are all but impossible to debug efficiently without a) understanding
everything around it and b) printing everything. Debug statements seem to
"ruin the cleanliness" (as well as genuinely ruining threading macro flows.

Do other companies use Clojure for non trivial web applications? Have these
Clojurians ever worked on a properly complex system? A lot seem to do just
data analysis with Clojure. More importantly, have they ever worked on a
properly complex system that they haven't been involved with from the start
where debugging comes back to 'intuition' and 'whack a mole' type debugging?

~~~
optionalparens
Wow, lots of questions. I am exhausted but will do my best to provide an
initial answer.

> impossible to debug efficiently without a) understanding everything around
> it and b) printing everything. Debug statements seem to "ruin the
> cleanliness" (as well as genuinely ruining threading macro flows.

I've never once had to add a debug statement to my Clojure code, not sure what
you are doing honestly. You can easily debug with Emacs + Cider which allows
setting breakpoints, inspecting, and evaluating forms while debugging. This is
much more than debuggers in many languages. Further, you can also use Cursive
+ IntelliJ which gives you pretty much the same thing, only more like most
people who have done Java, C++, or C# are used to in the various associated
IDEs such as IntelliJ, Eclipse, Visual Studio, (or Emacs/Vim for that matter)
etc. Given the data you are dealing with most of the time is immutable, things
couldn't be clear IMO.

The only time I find myself printing things is in the REPL. A few years ago I
did this more often in Chrome in ClojureScript, which mostly goes away now
with one or more of nREPL, Nightlight, Figwheel (or the many similar
libraries). In fact I'd say the debugging situation here is better than most
languages because you can instant eval things as well as live code, and see
those changes immediately in the browser.

Regarding threading macros, I assume you're talking about (->, ->>, ->as, and
so on). Again, you can just eval these partially in the debugger, and worst
case, bind something to a value you set in the debug session as you would in a
plain REPL session. I would agree these are harder to step through. If for
some reason you meant macros in general, I'll repeat what I always say to new
Clojure and Lisp users in general - do not write macros at the start, and when
you do, question the reasons why you are doing so. Macros are insanely useful
and powerful when you need them, but most of the time you do not for the
average app (obviously many exceptions). Worst case, you can macro expand,
paste that, and debug or debug the macro expand in an debug eval.

Overall, I've found debugging to be substantially less pleasant in most
languages that are popular such as Python and Ruby vs. Clojure but less
pleasant than say Smalltalk or a Lisp machine. Like many languages, the
situation with Clojure improves over time. People complain about the stack
traces but most of the time they don't bother me and each version has improved
on that. I came from the assembler, C, Fortran, Lisp world, so in some ways
that has made me more keen how to write code that is easy to debug and to not
fear debugging.

> Do other companies use Clojure for non trivial web applications? Have these
> Clojurians ever worked on a properly complex system? A lot seem to do just
> data analysis with Clojure. More importantly, have they ever worked on a
> properly complex system that they haven't been involved with from the start
> where debugging comes back to 'intuition' and 'whack a mole' type debugging?

Yes, there are various lists out there if you Google some. A brief list:
Amazon, Netflix, Pivotal, Walmart, Heroku, Factual, Capital One, Roomkey,
Spotify, Soundcloud, the list goes on. I think it's fair to say at least one
has a complex app and at least one is a not for data analysis. Clojure is
quite often used at very large companies that are almost surely building
systems more complex than yours (no offense, just basic probability). Saying
Clojure seems to be used mostly for data analysis and therefore implying it
might not be good for web apps is like saying that about Python, which in fact
is used more than Clojure for data analysis.

Regarding, web applications, by nature they are trivial compared to many
domains. Of course you can make things complicated by adding a lot of moving
parts, but these things are usually complimentary to a web app (ex: stream
processors like Spark, Storm, Google Dataflow). You can also make things more
complex than they need to be by bolting on frameworks and trying to shoehorn
your business and code concerns into it. This is one reason some people like
lighter frameworks for some purposes and heavier for others (see Django vs.
Flask for instance). Clojure generally spurns heavy frameworks for web stuff
because functional programming tends to encourage or even require composition.
As such, things already fit together and simply picking well-tested libraries
to form your "stack" tends to let you use the right tool for the job more
readily. Obviously this is somewhat subjective, but I think other people who
insist on heavy frameworks have something to learn here. If their framework
was so awesome, we would not need 10 more next week, and yet that is what
happens.

Regarding "intuition" and "whack-a-mole" debugging, I would agree that the
former is important, while the latter is a sign you've done something terribly
wrong. Clojure like many functional or data-first languages tends to push you
towards certain tracks that should really not lead you to whack-a-mole
debugging. The idea of immutability by default and functional composition in
part is that it is harder to screw up your state. This should make debugging
very clear at runtime since you can quite often literally dump your entire
state and have quite high visibility into what is happening in your
application. A good example of this WRT web dev as you mention is
ClojureScript (yes, not Clojure but same principle applies) and ReFrame or Om-
Next. You have a single representation of your state as an immutable database
that you update instead of things scattered about, meaning you can inspect it,
query it, access it across threads (if it was on the server), etc. In Clojure
and many languages, you need to think in terms of operating on data structures
not classes, objects, or potential language construct distractions. This again
drives away distractions while debugging that leads to shots in the dark. This
of course should feed your intuition too in that if you see something with a
weird state, you did something wrong like reset! instead of swap! or used
mutability or you're just understanding your own code wrong.

It's not really fair to compare, but like I said, I find the debugging
situation to be excellent. The fact that you can also live code with the
browser, work directly in a REPL session (I open them for days), and so on
means you can potentially write and test your code easily at the same time.
This is somewhat like TDD, but instead of just writing a unit test, you
actually run the code and get more immediate iteration and feedback. Of course
you can still do test-first TDD too and eval those and even run the tests in
the REPL. There are some traps here like stupid things you can do in the REPL,
but there are many libraries to help you solve this that promote practices
that are good regardless of the REPL (ex: Component, Mount).

I'm already writing too much, so I'll say with regard to what Rich says, just
read Clojure news groups and JIRA and such. He has said many times Clojure is
essentially a pragmatic balance of some of the super powers of Lisp with the
practicality but limitations of the JVM. Do you want a perfect language or one
that helps you get work done today but maybe better than a lot of what is out
there? Moreover, do you want a language you can use in reality or just
academia? Clojure solves that via the JVM and a huge existing ecosystem.

Anyway, feel free to ask more and good luck. I am sorry if I sound harsh, but
I am trying to give you real answers rather than fluff.

~~~
petagonoral
Fantastic write up. Thanks very much. Most definitely something for me to chew
on.

------
doobiaus
redis. Coming from years of old school "Web + DB + memcached" redis has blown
me away with what it can do from searchable lists for typeaheads to pub/sub.

------
q_revert
matplotlib. at times it can be tiresome, given the multitude of ways it's
possible to do things, but it's always _possible_

------
nojvek
Typescript + VSCode. That stuff is crack.

------
alex4Zero
I would say not tools, but Agile mindset

------
59nadir
I started out doing a few years of C++ and ended up fairly disenchanted with
programming. I had started when I was 14 and by 19 I was sure I didn't really
want to sit down and program every day, because it just wasn't exciting enough
anymore.

I found Python around 21-22 and it completely changed everything. I could sit
down and just flash through the whole process of idea to actual execution in
one day and I didn't have to micromanage everything. Programming became
exciting again.

A few years later I was having a hard time with some personal issues and I
ended up trying to distract myself with SICP. SICP just lifted a whole layer
of fog for me and while in the process of reading it I found Racket. So I went
into the rabbit hole that is Racket and found myself just unmasking
programming languages in general, making all of them so much simpler and easy
to learn. When I was done I just had a new appreciation for language features
and how to build them.

Not all that long ago I looked at Elixir and started playing with it. While
doing so I realized that there is no stack that can make playing with
processes as easy as the BEAM and what that means for the apps you're making.
The BEAM changed the way I looked at multi-threading and concurrency and it's
the platform I'd use for all forms of control systems, with the branches in
those systems either running entirely on the BEAM or just communicating to
external nodes in other languages when needed.

After about 4-5 months of Elixir I landed a job using Erlang at a game studio
and I'm extremely happy to be using the BEAM professionally. We're allowed to
create fairly amazing things and the things we build, even though I don't
agree with the reason they're being built all of the time, are made possible
only because of the BEAM (running interop with Lua, etc., running all
communication through the BEAM).

Lately everything's finally clicked for me with Haskell and I find myself not
having issues with the things I had issues with previously. I don't know how,
exactly, but I think I let my brain finally absorb "Real World Haskell" (the
best book, in my opinion: If you're only going to read one, don't let it be
"Learn you a Haskell". LYAH is nice as a reference, but I don't think the
demonstrations in it are very good, relevant and exciting) and so I was able
to _not_ worry about monads and simply use them, letting the idea of them just
emerge in my head because of familiarity with them from usage, instead of
forcing monad tutorials on myself.

When I started to appreciate Haskell as just another language is when I
finally understood why it was so great. It's amazingly practical and I've
redone some of my older Python projects in Haskell only to find that I've got
about the same LoC count even with types, which means that I've got more
safety, more robustness and I can add things faster and with less headaches.

With these languages, there aren't many things that are impossible, and I feel
like they've all changed something in me in terms of how I look at
programming.

------
jafingi
LINQ

------
geebee
First, ASP and Microsoft Access. I know, I know. But it made it so easy to
create a web based prototype. I was in grad school at the time, and I was able
to put working software on the web as part of class projects. People were
impressed with that back then. Man, it got me hooked.

Next, JSP and Servlets, JDBC, and MySql, along with POJOS. Made it easier to
write consistent, clean code, and along with the Java Cookbook, programming
was a lot of fun for a while.

It all almost ended with JSF, Struts, Struts2, Spring MVC, Spring DI, Pico,
Wicket, Tapestry, Hibernate, JPA... these were often the product of good minds
and talented engineers, but, yeah, this almost ended my career in programming.
I remember seeing a sysadmin and unix book on the desk of a web developer. I
asked what he was learning for, and he gestured to a long row of Java related
web books on his shelf. "I just want to be a systems administrator", he said,
"I can't deal with this churn anymore." What had been fun now required a 2,000
page stack of books with constant churn, and so many little integration errors
that doing even the simplest thing was a true slog. I wanted to secede as
well, but many teams (and recruiting managers) absolutely insisted on this
stack. I figured software was "over" for me, at least in web dev...

Then, Rails. Pretty much saved programming for me. I get it, it's not the new
shiny anymore, but it was blissful to get back to such a productive
environment. Although the Rails community was too brash and dismissive of
reasonable criticisms and efforts to improve the stack, I understand the hurt
that was behind this angry rejection of the "enterprise" world. Get stuck on
an "enterprise" Java project in 2004, see nothing get done, and then watch as
people try to shoot down Rails or Django, and you'll understand why the anger
hit this level, why people cheered when the simple words "Fuck You" were
offered as a retort to J2EE criticisms of Rails. It's better to be civil even
as you disagree with everything you've got, though, (the Django community
seemed to understand this better than the Rails one).

Lately, javascript framework churn has pushed me back into the way I felt
during the explosion of Java based frameworks. The difference is that I know
understand that this will pass, it's a period of chaos that often accompanies
a large shift in technology and focus. It will settle down, and what emerges
will be simple, effective, and useful. However, I am also making an effort to
find shelter from the storm. Eventually, this will be sorted out, but I don't
want to get sucked up into the vortex for several years like I did with Java
in the mid 2000s. Like a lot of devs, I'm looking to stay on the backend -
though this has always been my inclination anyway.

Lately, scipy and scikit-learn, I hope. The ease of doing formerly difficult
things may lead to some awesome new directions!

------
dschiptsov
MIT Scheme, Common Lisp, SML, Haskell, Erlang.

Scheme - it's so concise, clean, Wow!

CL - LOOPing macros, SETF, OOP is just a bunch of slots and macros. Wow!

SML, Haskell - static typing done right. Wow!

Erlang - Wow!

Scala - concepts from SML + design choices from Erlang.

Java, JavaScript - Packers, packers everywhere...

~~~
kolanos
Wow.

------
sconxu
For me it was when I discovered React-Native. As a one man show in the
beginning of our mobile application existence, developing both for Android and
IOS at the same time was a blessing.

------
anythingbot
identity-fixing monotone (in the prefix relation, a partial preorder) maps of
cancellative monoids. It is possible to use them as a model of abstract
sequential computation, so they can be used for applications such as
mathematical models of compilers, parsers, ...

[http://mathoverflow.net/questions/251059/what-is-the-real-
na...](http://mathoverflow.net/questions/251059/what-is-the-real-name-of-this-
relation-and-operation-on-a-particular-set-of-maps)

------
gaius
It's far from cool now of course but Java, in 1995.

