
If you had to start over, what technologies would you learn in 2014? - PhilipA
http://www.hanselman.com/blog/IfYouHadToStartOverWhatTechnologiesWouldYouLearnIn2014.aspx
======
skrebbel
Folks, the big point of this article is not that Hanselman likes C#, it's that
his list of options does _not_ include Objective-C or Java. It's that he
thinks that the web will win (over app stores). I strongly believe that he's
right there.

At some point, app stores had "discoverability" as an advantage over the web.
This has been one of the strongholds of native app proponents. These days
however, with the enormous amount of apps available on popular platforms, this
discoverability feature has become a joke. It's akin to searching the 1999 web
for interesting sites but you can _only_ use a badly managed, bribe driven
version of Yahoo.

Whoever can make the Google of app discovery might make a temporary splash,
but i bet that, not long after, people will return to plain old Google Search.
You only need 1 major mobile OS to change paradigm and hide the difference
between apps and web apps, and your mom won't care anymore. Given that the
world's #1 mobile OS is made by the worlds #1 web company, this change is not
difficult to predict.

~~~
fossuser
I don't think it's just discoverability though.

I think the main question is if mobile web applications will be able to match
native on both quality and performance.

Facebook attempted this and failed badly, but that doesn't mean it can't
happen or that native will always have an edge. If native does continue to
have an edge though then I think web has an uphill battle.

~~~
bad_user
On Facebook, I remember a time when the native app was horrible on Android.

In many ways it still is - it requires too many permissions and the list is
growing. Recently they're asking for access to my SMS messages and in Android
4.3 I had a bug with my Nexus 4 in regards to location services as the Wifi-
network provider was draining my battery and so I had to disable it, so
Facebook's app was still requiring it, activating the GPS on each opening of
the app and there was no way to turn that off, unless I turned the GPS off
globally. Granted this is also a failure of Android's permissions system, but
...

The mobile web interface was and is still there. It doesn't matter if the
mobile platform is new or old, it doesn't matter if Facebook's app was
developed (and approved) for that platform, the web interface is there and it
works, the only requirement being for the user to have a decent JS-enabled
browser.

People view Facebook's investment in their mobile web interface as a failure.
I view it as competitive advantage.

~~~
fossuser
I suppose in your case you're choosing between two bad options.

The iOS app is an example of how much better a native app can be from the web
app - and the new paper app even more so.

I remember the android one being terrible when I had android phones a couple
years ago - but I thought that was because it was basically a wrapper around a
web app.

~~~
bad_user
You kind of missed the point.

What if history repeats itself? What if iOS will in the end fail in the
marketplace, reducing its share to a single digit? What if Apple continues
against all odds to develop and support it, like it did with the Mac OS? What
if you'll still use it?

Wouldn't you be happy then that there's a web interface available?

And from a developer's perspective - you could say that you want to target iOS
users first. That may work out well for you. However, for example, I never,
ever tried Instagram because when Instagram was all the rage, it wasn't
available for the platform(s) that I'm using. And later the momentum for me
was gone. That's a lost opportunity.

In the end, it may work out well for the developer - however, considering that
iOS's marketshare is minuscule compared to the people that have access to web
browsers, I personally don't see how you can build the next Google or Twitter
or Facebook by not targeting the web _first_.

For another example of companies that failed to do this - WhatsApp Messenger
will probably die or get acquired, because Facebook is eating its launch, as
Facebook works everywhere and when I send a message to my wife, she either
reads it on her phone, or in the browser tab that she keeps open when on her
laptop. FB's messaging works on my iPad too, whereas WhatsApp doesn't because
WhatsApp is identifying users by their phone number.

~~~
fossuser
That is a good point and I don't disagree with it.

I suppose mine was more targeting the difference between mobile native
applications and mobile web wrappers.

Facebook's web interface for 'real' computers is great and companies that
don't have one would probably benefit from one for the reasons you mentioned.

On the mobile side though I still think native applications are worth the
investment and that'll be hard to change unless the web apps can actually
offer similar design and performance.

I'd love to be wrong though.

------
gizmo
It depends on your goals. If your goal is to do a startup, then the obvious
choice is to really master an entire web stack. For instance linux / nginx /
python / html / css / javascript.

If you want to do research in computer graphics, then you better learn OpenGL
and C++ or .NET. Want to work in embedded systems? C.

Scott's recommendation of C# & Javascript is a solid and pragmatic choice,
good for those looking for a safe career in software. But it's certainly not
the right choice for everybody, and even 30 years from now there will be
plenty of challenging opportunities that have nothing to do with the web or
javascript.

~~~
donniezazen
Can you do without only Python and its framework for programming side? As
someone new to programming, I find it mind boggling how folks suggest learning
multiple languages. Or does it become natural after you know one language very
well.

~~~
Silhouette
The thing with programming languages is that while they sometimes look very
different cosmetically, they often share similar concepts under the hood.

IMHO, you won't go wrong learning one language reasonably thoroughly as a
starting point. In fact, I'd recommend it for several reasons.

However, sooner or later, you'll probably hear that another language might be
more useful for another project you want to do, and maybe then you'll learn
that second language too. As you do, you'll notice similar ideas cropping up,
even if they go by different names or use different syntax.

As your experience grows, you start to think of each programming language as
being roughly in this family or that family in one respect, and maybe being
like these other languages or those other languages in some other respect. You
also probably notice more what still makes each language distinctive, whether
it's a few idioms that make writing a certain style of code easier, or maybe a
couple of unique features that aren't widely available in other languages that
are otherwise quite similar.

In the long term, it's these distinctions that make it useful to know several
different languages. Even then, most of the languages you know will draw most
of their tools from the same toolbox, and learning when to use a hammer and
when to use a screwdriver will be more important than which brand of hammer or
screwdriver you buy.

------
crazygringo
If you're looking to maximize your choice of companies to work at, one piece
of advice could be to focus on front-end instead of back-end.

I'm equally proficient at front-end and back-end, but the last time I did a
whole bunch of interviews, I advertised myself as a front-end programmer
(since there aren't too many full-stack positions around).

Why? As a back-end developer, you're limited to picking companies that match a
single one of the three broad back-end categories -- generally Java,
Microsoft, or "open-source" (PHP/Ruby/Node/etc.) -- since any programmer is
usually only going to be really proficient in just one of those. If we assume
companies are split 3-way, you're instantly limiting yourself to 1/3 of
possible companies.

But on the front-end, there's no balkanization. It's just JavaScript,
JavaScript, JavaScript. It's not too hard to learn JavaScript and jQuery
inside and out, and with some solid CSS experience, knowledge of good
development patterns, and maybe a framework or two, you can interview
practically _anywhere_.

~~~
macspoofing
>It's just JavaScript, JavaScript, JavaScript.

No it's not. Because JavaScript the language is so bare-bones, you need to
supplement language deficiencies with frameworks and libraries. So you go and
pick from a menu of Backbone/Marionette, Angular, ExtJS, Ember, Kendo, jQuery
or etc. - some of them work together, some of them don't. Most of those get
you part of the way there, you may still need to pull in things like
require.js to manage imports. Or, instead of raw JS, you go with TypedScript,
or Dart, or CoffeeScript, or whatever, and then put a framework on top of
those. You're still not done, because that gets you the JS part, usually you
complement it with a CSS framework (like bootstrap) and a SASS framework. In
the end, you have a hodgepodge of frameworks of libraries, that plug JS holes,
and functionally look and feel different.

So no, it's not simply JavaScript everywhere.

~~~
DanHulton
It's javascript, angular, and jQuery.

Seriously, jQuery > all the other "low-level" libraries out there combined,
and Angular > all the other frameworks out there combined, _several times
over_.

If you want to interview practically anywhere, learn those three and you're
solid.

~~~
Silhouette
_Angular > all the other frameworks out there combined, several times over._

Sure. But according to my in tray, last week it was Backbone, next week React
is taking over the world, and by March we'll have standardised web components
anyway.

It may be true that today Angular is much more popular than all the other
frameworks, but if so, it will probably be a short-lived peak and IMHO says
more about developers putting too much faith in frameworks generally than
anything else.

~~~
davidjnelson
Angular can easily work as a facade to the underlying es6 features coming
soon.

~~~
Silhouette
But why would you want it to? It's likely to wind up being a leaky abstraction
at best, assuming it survives that long, which is far from certain given
Google's track record. If you want to be bleeding edge with web components, I
would have thought experimenting with Polymer would be more interesting and
give an easier transition to native features as they become available. If you
want a more production-ready component-style framework today, why not use
React instead of Angular?

------
stiff
This idea that a software engineer picks a language as his "favourite" and
becomes a "Ruby developer" or a "JavaScript developer" ever since is
completely misguided, and I'm sad to see it cherished further in this article.

Languages are tools, and tools should be picked depending on the project: its
application domain, performance requirements, availability of libraries for
important subproblems that have been identified, target platform, etc., there
are lots of very concrete factors to look into. Completely ignoring those
factors in favour of choosing your "favourite" or one of just 2 languages you
happen to like, is going to have suboptimal results. A good engineer knows a
lot about programming languages in general (what is taught in a university
"Programming languages" course), has basic experience with a huge number of
languages, and picks the programming language for the project based on this
knowledge, based on research and on prototyping, that's how I see it.

I recommend looking back at Marvin Minsky's 1970 Turing Award lecture "Form
and Content in Computer Science". Little has changed since:

 _The trouble with computer science today is an obsessive concern with form
instead of content._

[http://web.media.mit.edu/~minsky/papers/TuringLecture/Turing...](http://web.media.mit.edu/~minsky/papers/TuringLecture/TuringLecture.html)

~~~
sliverstorm
Becoming a "JavaScript developer" surely pigeonholes you, and that is not
good, but early in your learning process it can be good to pick a bread-and-
butter language to master first.

That way, you aren't spread thin as you learn everything for the first time,
and when you learn new languages you can relate them back to your first
language, of which you have a complete grasp.

Naturally in the long run you want to be totally language agnostic, but early
on I think that's putting the cart before the horse a bit.

Also, you have guys like me, who code as an ancillary function to our actual
job. For us, one or two workhorse languages are all we really need to invest
our time in. Think of a physicist who knows Fortran, for example. He is a
"Fortran guy", but that's ok. He's a physicist, not a developer.

~~~
nostrademons
The other nice thing about picking a "bread-and-butter" language is that it
qualifies you for opportunities where you can leverage it to learn other
skills. It's so much easier to learn, say, machine-learning if you enter a
company where there are machine-learning experts that you can observe at work
and ask questions of, rather than just trying to read all the online course
material. That requires having something to bring to the table, and if you're
really good at frontend stuff you can get hired at places that do that and
work on projects where people are doing really interesting backend stuff.

------
spamizbad
Ultimately these things are a matter of opinion, but as a developer who knows
C#, I'm not sure I'd bother to learn it again if I had to completely reboot my
knowledge. I can understand the perspective of being pragmatic with regards to
the job market, but while there are an abundance of C# jobs available, offers
tend to be lower unless you're specialized in Sharepoint or _very_ senior.
Culture can be a challenge in those shops as well.

"Professionally" I've worked the most with Python, JavaScript, PHP, and C#. Of
those, I'd only keep JS and Python. I'd swap out C# and PHP for Clojure and C
in a heartbeat. Probably not the best for job prospects but definitely the
most fun.

~~~
UK-AL
In the valley, python & ruby will probably have higher salaries.

Outside probably Java and C#.

~~~
72deluxe
That's probably different in the Welsh valleys.

------
almata
"Ultimately, we're all amateurs." \- Wow, that's something I've been thinking
a lot lastly. It's true that a good developer can learn a new language (or
technology, or even paradigm) in a quite short amount of time, but at the same
time, when we're constantly doing that it's true that, as an effect and as the
author says, we're becoming permanent amateurs. I don't have a solution for
this though (maybe there is no solution at all, or maybe there is not even
supposed to be a solution).

~~~
acomjean
Its true. To quote a wise man at the php conference "I get the feeling we're
just making stuff up that works" when talking about scaling sites.

Its about being a professional in the way you handle the tools at your
disposal.

This has been going on for a while. It was noted last century that a job
opening asking for "5+ years experience" in a technology that was 3 years old.

------
cmdkeen
I'd actually recommend a slight variation on the C# javascript combo -
Typescript instead. There are all sorts of tools coming out that allow you to
generate Typescript interfaces from your C# giving you really nice compile
time safety through your entire stack.

If you're writing C# then Typescript feels more natural, especially in Visual
Studio it removes much of the painful context switching between a typed
intellisense driven development and a javascript free for all.

~~~
duncanawoods
I liked the idea of typescript but after frustration from fundamental issues I
was very happy to bin it.

i) Wrapper libraries - Sure you can download them from definitelytyped but in
practice I quickly found all sort of incompatibilities and things not working
when used on real versions of the wrapped libraries. I had to edit them based
on suggestions from forums. They are unversioned community efforts - poor
versioning and no package manager is just a nightmare given the dozens of
libraries we have to use for modern JS.

ii) Tooling - I thought this was the benefit and tried using it from WebStorm
which claimed Typescript support. I found no meaningful intellisense only that
it shelled out to the TS compiler in the background with some flakey syntax
highlighting. The worst issue was that the compiler could regularly produce
totally opaque error messages that were poorly located to the code issue and
probably in the wrapper somewhere.

iii) Arbitrary apis - this is what I thought I wouldn't face but it was. Just
a single line of code trying to the most basic task of creating an express
server took hours of googling for the magic incantation. Most advice referred
to the wrong version. It appears there are javascript patterns that typescript
wrappers struggle to represent so the authors have to invent new ways of
offering an interface. Wrappers don't come with documentation... even if they
did, you now have to read both the original and the wrapper documentation. Not
cool.

I hope some of this is now fixed but to have unreliable wrappers, no
versioning and bad error messages means I am not hurrying back anytime soon.

~~~
shadowmint
I use pycharm with typescript, and either I have a new version or the pycharm
plugin is far different to the webstorm one. All the refactoring options,
jump-to-symbol, type hinting, type completion and inline-error checking work
really well for me.

There are some pain points to be sure (modules, generics that don't quite
work), but:

\- Emits known good javascript patterns, preventing javascript's typical '50
ways of doing something'.

\- Interacts cleanly and nicely with the existing javascript ecosystem.

\- The emitted javascript runs on old browsers, and is only marginally bigger
than the source code, smaller sometimes, if you use interfaces

\- Clean module system (a little irritating to use perhaps, but still)
supporting AMD and CommonJS (this is absolutely the future for JS
dependencies).

\- Open source, installable compiler using npm.

What's the alternative?

    
    
        - native JS      <-- Not a bad choice, needs discipline to maintain code quality
        - coffee script  <-- Interacts poorly with existing js ecosystem
        - dart           <-- Doesn't run on old browsers, poor interop
        - emscripten     <-- Massive output, poor interop
    

I cant say I'm any hurry to add C# into the mix, but typescript has impressed
me thus far, _despite_ being from Microsoft.

~~~
camus2
> \- coffee script <\-- Interacts poorly with existing js ecosystem

Why do you think that ? Coffeescript is basically javascript without the bad
parts.

~~~
shadowmint
Really? Maybe I should have another closer look at it. I saw this from the
homepage:

    
    
        Embedded JavaScript 
        Hopefully, you'll never need to use it, but if you ever need to intersperse
        snippets of JavaScript within your CoffeeScript, you can use backticks to pass
        it straight through. 
    

...and struggled to do basic things like interact with handlebars and jquery,
and figured it was one of those 'works with other things written in coffee
script' things.

Not so?

Why are there so many SO questions about 'how do I use coffee script with
XXX'?

(where XXX is some existing javascript library, eg. jquery)

~~~
camus2
What specific problem did you have with jquery and coffeescript, or handlebars
and coffeescript ,that's my question to you.

Coffeescript is a 100% compatible with javascript , the fact that you can
embed javascript in coffeescript is a feature of the language,not a problem.

> I saw this from the homepage:

So what ?

> Why are there so many SO questions about 'how do I use coffee script with
> XXX'?

How does it mean coffeescript has compatibility issues with javascript ? You
are just bashing coffeescript without any real argument against it. There are
arguments against coffeescript , compatibily with javascript is not one of
them. You dont know coffeescript. If you knew CS you would not have these
bogus arguments against it.

Coffeescript fixes Javascript bad parts , Typescript doesnt,it just add a few
keywords and compile time type checking to the language, which is unecessary.

Typescript on the other has compatibility issues with javascript libraries
since one needs ambient declarations to use 3rd party libraries, some extra
work not needed with Coffeescript.

------
TuringTest
The Functional Reactive Programming paradigm is going to hit hard. It makes
parallel programming extremely easy, which is a huge bonus for multithreading
(a great way to harness multiprocessors) and for loading web pages
asynchronously.

Libraries for this programming style are being created for almost any popular
platform, and knowledge is spreading quickly. I recommend following some
tutorial or online course on the subject.

------
stcredzero
The sweet spot for Bang for the Buck, for a typical programmer, would be Go --
then use it in a functional style. (Except for in strictly delineated
circumstances, the entire code base should have zero side-effects outside of
the current function scope.)

This gives you a safe, easily concurrent language, plus most of the benefits
of functional programming, but without as shallow a learning curve. (Meaning
not as hard. Learning curve is not an analogy for a steep road! Height = stuff
learned!) You also get very good debugging. (gdb and cgdb in particular)

I'm writing my current project in Clojure, however, because it has most of the
advantages of the above, but the available GC technology for the platform is
far superior. (You'll have to learn some new debugging tricks, however.)

------
vinceguidry
If you're in the US, learn whatever the hell you want. Then move to a biggish
city and find a job using it. Bam, you are now equipped to take advantage of
the biggest tech boom the country has seen since the 1800s. The 90s wishes
they were this good.

------
rip747
I've been doing ColdFusion for well over 13 years now. The reason I choose it
was because at the time the only other web technology that looked promising
was ASP and I _hate_ Visual Basic with a passion. Today I'm focusing all my
attention on C# and Ruby.

That all said, if I had to start over today... I wouldn't be programming, I go
back to networking. As much as I love programming, it just doesn't amaze me
anymore. I guess its the lack of physical interaction. I'm starting to dread
typing on a keyboard for a living.

I look at all my friends in networking and see all the cool toys they get to
play with and want to jump in the sandbox.

~~~
CmonDev
Pick a job that will not get automated in 10 years.

~~~
rip747
care to elaborate on what exactly you mean by "automated". I fail to see how
installing physical hardware can be automated.

~~~
viraptor
The new keyword is SDN I guess - software-defined network. A lot of what was
the standard in networking and hardware domain is migrating to software now.
Especially when you're running many dynamic virtual hosts, you may want to
move the tricky networking parts into easy to redefine software configuration
on the host itself.

This idea will get only more popular soon. Of course there are also products
that allow you driving the physical boxes remotely - like openflow. I think
the mix of those technologies will get quite important in the future. I'm not
sure if that's what the GP meant though.

------
herghost
I think Virtualisation, Automation, and Orchestration technologies would be
the best place to start again. I've seen some really impressive things done at
pretty impressive scale with this stuff.

------
habosa
If I could start over and pick one language, it would be Java. If I could pick
two or three I'd add Python or Ruby but let's stick with one.

Everyone knows Java is great (or at least pretty good) for "building large
systems" like the article said. You can learn a lot about software engineering
from all of the practices that have built up in the Java community over the
years. Note that I'm not talking about gross JavaEE stuff, but just good,
solid OO programming with an incredible about of libraries for whatever you
need.

The real reason I'd push for Java is Android. Android programming is an
incredible way for a newcomer to get non-trivial code in front of a large
audience in a production environment. Writing an Android app has a decently
steep learning curve, but once you get the hang of it you can really make
progress quickly. Then you can publish to the Google Play Store with no app
review, no $99 fee, and no Mac required. You'll get some downloads and real
feedback on almost any app.

The first app I ever made was a total piece of shit and it got 50,000
downloads. It had a ton of bugs that people asked me to fix and it taught me
how to make something that people actually want in an environment where I had
nothing to lose. Even ended up making a few hundred dollars on ads which
18-year-old me thought was pretty damn cool.

There is an intoxicating feeling when you realize that a few hundred or few
thousand people out there are running your code in their pocket, and it makes
you want to create even more. It's the same with iPhone/ObjC I'm sure but I
think Java has more other uses and Android is definitely a less intimidating
platform for a beginner to just put something out there.

------
taude
1) Any high-level language that runs in the Java VM. Because 1) there's tons
of open source libraries 2) syntactic sugar for devs 3) operational stability
of the VM 4) flexibility of running it on both open source and closed source
OSes meeting a variety of business requirements.

2) A scripting language for gluing your operations together, for quick and
dirty services, prototyping, etc...: Python

3) JavaScript.

~~~
camus2
Is there a C# on the JVM ? it would be awesome.

~~~
viraptor
There's jvm for .net: [http://www.ikvm.net/](http://www.ikvm.net/) and .net
(clr) for jvm: [http://xmlvm.org/clr2jvm/](http://xmlvm.org/clr2jvm/)

------
um304
I would really like to know other folks opinions on this point mentioned by
the author: "The web will persist and the web will win."

~~~
Spooky23
It's not necessarily a conflict that has an end. Because web-based stuff is
standards-based, you'll always have a lag between state of the art and what is
available in a standard. IMO, that's a good thing -- it pressures the market
to continue innovating.

People at Netscape were talking about the web displacing native applications
twenty years ago. That hasn't happened yet!

~~~
_random_
Well, there will always be at least two native apps - the browser and the
server.

------
Thiz
Cordova is the future and the future belongs to those who prepare for it
today.

Learn Cordova.

~~~
izolate
What makes you so sure Cordova is the future? Curious.

~~~
Thiz
Code once, run everywhere.

Discoverable, searchable, updatable, all the good qualities of a web app with
the power and speed of a native app.

Of course you need HTML, JS, CSS and the whole web stack, but the good thing
is everybody already knows it. Standards are good.

Apache is behind it, also Google, Firefox, Ubuntu, everybody benefits from a
standard way of developing apps once, but very specially users, and coders.

It has to be the future, it will be no matter what, no barriers will be high
enough that a great idea can not overcome.

Cordova is that idea.

~~~
_random_
"good thing is everybody already knows it" \- so you recommend to learn
something everyone else will know... I guess differentiation on the job market
is not a part of this strategy.

"everybody benefits from a standard way of developing apps once ... and
coders" \- my feeling is that it's 50% of HN spirit is building things in
different ways. Just look at all those awesome languages, libraries and
frameworks coming out every week!

------
drdiablo
My opinion on "the web will persist and the web will win" is that it's not a
won battle. Native apps have always been smoother, giving users a better
experience overall. On the contrary, mobile web apps have been bad, and
haven't much evolved since we started having mobile devices (laptops don't
count :p). I'm pretty sure that the future resides in mobile devices, and they
can't rub the web, we'll have to use the alternative: native. At that point
nothing stops Apple or facebook to go entirely native and therefore abandoning
the web ideology (and the physical web). So I think that the web is a possible
future, but nothing is settled yet, we need more groundbreaking ideas from the
web to make it a desirable choice of future.

~~~
_random_
I think there are too many smart and capable developers in the world to settle
on old poorly-upgradable languages for everything. So hopefully there will
always be a choice.

------
weavie
I would have thought that learning two languages at the same time.. especially
with one of them being javascript would be a bit of a brain overload.

I would just suggest sticking to javascript to start with. You can do front
end, node and mobile. With that under your belt you would then be in a much
better place to jump to a different server language and would know more about
which one would be the best fit for you. But focus on one thing at a time,
you'll learn much quicker that way.

------
geogra4
SAP. It's not particularly exotic but it runs the world.

~~~
mbesto
You mean ABAP ;) Actually SAP is at a very interesting crossroad right now.
You don't _have_ to know ABAP anymore. If you can leverage SAP Gateway and
check out OpenUI5 -
[http://sap.github.io/openui5/](http://sap.github.io/openui5/) you can make a
name for yourself. There is heavy demand for this area right now and not
enough supply.

EDIT- If anyone is interested in this area, let me know!

~~~
greendata
I'm a current python/ruby/javascript contractor interested in getting into
SAS/ABAP consulting and development. Do you have any recommendations where to
start?

~~~
mbesto
I sent this response to a few people who emailed me already:

Check out: [http://scn.sap.com/community/netweaver-
gateway](http://scn.sap.com/community/netweaver-gateway)
[http://scn.sap.com/docs/DOC-27405](http://scn.sap.com/docs/DOC-27405)
Especially check out SAP Fiori -
[http://scn.sap.com/docs/DOC-41598](http://scn.sap.com/docs/DOC-41598) \- this
is SAP's unified workflow app.

Basically SAP has put a lot of effort into taking it's old archaic back-end
and making it "open", and Gateway enables backend systems like ERP/CRM/etc. to
be able to talk to any RESTful front-ends (mobile, js, etc).

Go ahead and play with their oData demo system:
[http://scn.sap.com/docs/DOC-31221](http://scn.sap.com/docs/DOC-31221)

Let me know if you have any other questions!

------
room271
I would learn (as someone who is interested in backend stuff - scalability,
high-performance systems, apis) related to web-work:

\- HTTP \- C (because it teaches you how computers work a bit) \- One of the
new JVM languages (either Clojure or Scala, preferably the first) \- some bash
(for scripting)

Realistically that is a lot to learn in a year.

On top of that I'd start dabbling with Javascript but not expect to learn it
this year (that's for next year).

------
FigBug
If I could do it all again, I'd study a lot more math in University and
probably end up focusing on something like Audio DSP. I think it's a pretty
safe career choice since it's hard self learn compared to a lot of other
fields, meaning competition is less. And if you are good, companies will
happily pay you to learn tech of the week.

~~~
dankoss
Less competition, but also less demand and less career options.

Source: This is what I do.

------
alkonaut
I'd learn F# + C + Rust + TypeScript/ES6. Anything that lets me avoid learning
C++ or JS.

~~~
nly
Once you know C, you've already gone through most of the pain with regard to
C++s warts, but you still have to treat it as a new language.

I really don't know why people have such a problem getting to grips with
pure-C++ functionality like templates, virtual functions, inheritance, RAII,
exceptions, references, type system oddities, rvalues and lvalues and their
references, operator overloads, extended temporary lifetimes, smart pointers,
runtime type information, the lack of decent unicode support, slow compilation
times, binary compatibility which is tricky to maintain, member function
pointers, virtual base class construction order, SFINAE, and static
polymorphism and concept checking.

It's really not that difficult... ;)

~~~
alkonaut
I don't mind the C++ that is "C with objects". What bothers me is the broken
template metaprogramming, endlessly varying kinds of special pointers, massive
libraries that does the same things slightly differently and so on.

~~~
72deluxe
"endlessly varying kinds of special pointers" haha that made me laugh thanks!
I had never noticed it before!

TBH, although Bjarne in his most recent book heartily recommends using
references everywhere and smart pointers, I seem to be throwing pointers
around with no problems. The RAII approach and clean up in the destructor is
the safest way to do things in C++, and the tidiest!

I would have great difficulty moving over to C to think of a way to write a
program, so it is comforting to find someone who would struggle to move to C++
from C. They really are different beasts.

Again, thanks for the laugh haha

------
LeicaLatte
Apple has been around for 30+ years, are a 100 billion dollar company now and
are here to stay. Definitely objective-c.

Javascript because every device made today or tomorrow will ship with a decent
javascript runtime.

Then move on to the things you personally like.

------
bitwize
.NET and JAva because that's where the money still is.

------
spitfire
I'd learn computer science, again. Languages come and go, the core tools for
thinking are solid foundations.

Then I'd learn Lisp, Python/Ruby and Mathematica.

------
piratebroadcast
Im currently learning Rails and Javascript- Good to know I seem to have made a
safe choice.

------
mrmondo
Python - I believe it's the language of the now and the near future.

~~~
camus2
Python is multipurpose and has great libs, but personaly I dont like the
language itself. I think Ruby is a better designed language , but Ruby has
problems too. Unfortunatly the perfect language + ecosystem doesnt exist.

~~~
collyw
I think you would like Perl :)

------
nly
C++14

------
ilaksh
My favorite things right now which I am happy to recommend are ToffeeScript
[https://github.com/jiangmiao/toffee-
script](https://github.com/jiangmiao/toffee-script) with Node.js and Nimrod
[http://nimrod-lang.org/](http://nimrod-lang.org/). I also think LiveScript is
awesome.

AngularJS is great. Web Components are better I think though.

Docker has redefined devops in my opinion [http://docker.io](http://docker.io)

GLSL is very cool and something you can even experiment with in your browser
using Three.js etc. I believe that real time ray tracing is going to be a
thing within a few years
[http://www.youtube.com/watch?v=abqAanC2NZs](http://www.youtube.com/watch?v=abqAanC2NZs)
[http://www.youtube.com/watch?v=V5Y06xkRWio](http://www.youtube.com/watch?v=V5Y06xkRWio)

CoreOS looks very interesting.

WebRTC is a technology that could almost make an industry irrelevant.
[http://simplewebrtc.com/](http://simplewebrtc.com/)

Understanding APIs around bitcoin and cryptocurrency in general seems
important.

I believe that the internet is eventually going to be switching away from
normal named server structures to a content-oriented architecture.
[http://en.wikipedia.org/wiki/Named_data_networking](http://en.wikipedia.org/wiki/Named_data_networking)
There are a lot of ways this category of architecture is actually currently
being deployed behind the scenes, for example CDNs or bittorrent. I believe
that we are going to start using that type of system more and more and
eventually we will lose things like the HTTP layer. This may be combined with
some of the technologies related to cryptocurrency.

For an example of why we are moving to named data networking, take a look at
well.. just about any web application that wants to scale. For example the npm
registry. Also consider the issues around privacy with Facebook and the NSA,
and the ability for governments to censor or take down web sites or domains.

So any technologies that facilitate things like that, such as more traditional
clustered SQL or NoSQL tools, or especially protocols and systems specifically
designed for named data networking, will be very powerful. I like the idea of
heterogeneous peer nodes that have everything they need built in and can
connect to the network on their own.

Another area that is really going to be key is artificial general
intelligence. Notice I did not say machine learning. I think look at taking
advantage of built deep learning systems like the one IBM has with Watson. Or
look for deep learning, autoencoders, hierarchical hidden markov models,
hierarchical temporal memory. But most practically for the next few years IBM
and Google's (when Google releases it) cloud AIs are going to be game changing
for many industries and harnessing them in software will be very useful.

Qualcomm/Brain Corporation and some others also have some neuromorphic chip
technologies that could be extremely useful.

Any system that really takes advantage of next gen VR devices like Oculus Rift
is going to be interesting.

~~~
idProQuo
I've never heard anybody mention Angular and Web Components as solving the
same problem. I'm pretty fuzzy on front end MVC stuff in general, but I know
almost nothing about Web Components. Do you know of any good tutorials or
resources?

~~~
ilaksh
[http://customelements.io/](http://customelements.io/) [http://www.polymer-
project.org/](http://www.polymer-project.org/) [http://www.polymer-
project.org/docs/polymer/databinding.html](http://www.polymer-
project.org/docs/polymer/databinding.html)
[https://github.com/webcomponents/element-
boilerplate](https://github.com/webcomponents/element-boilerplate)

For comparison to Angular, see [http://angularjs.org/](http://angularjs.org/)
Create components section or
[http://docs.angularjs.org/guide/directive](http://docs.angularjs.org/guide/directive)
.

Reusable components along with two-way data binding are the most important
features of Angular. Web Components does components in a more product neutral,
standardized way with a nicer API. Creating custom directives for elements in
AngularJS is a pain.

------
pouzy
I like Python. It took me a while to get out of PHP, so I guess I'd drop PHP
to jump directly in Python.

But most of all I'd learn how to fix a car. They are such a pain when they
break.

~~~
pouzy
Ho, and most definitely mobile languages. That will all put us out of our job
if we can't move into that field.

------
iamyatin
my language would be python.. it's everywhere.. be it android, raspberry pi,
scientific computations, and what not.

------
interstitial
I'm sorry did you ask what technologies, or what over-arching philosophy of
self-improvement vs. pragmatic career development we should debate?

------
moron4hire
To start over again, I'd have had a much bigger focus on standards and open-
source, standards-compliant software. Having been spoiled by Visual Studio, I
now lack the patience necessary to setup a dev environment from scratch with
Emacs or Vi or whatever.

And no, Eclipse is not an alternative, though _maybe_ NetBeans is, which are
two statements I really wouldn't have said 10 years ago. I don't really feel
like it's a case of Visual Studio having gotten significantly better. NetBeans
has gotten significantly better and Eclipse has gotten significantly worse.
MonoDevelop and Xamarin Studio are waaaaay too buggy to be useful. I find
myself gravitating to a text editor like Geany or really anything that
combines syntax highlighting, tabbed documents, and a file explorer. It's
amazing how infrequently those three things come together (I'm looking at you,
Notepad++ and Notepad2), or just don't work very well (Hi there, LightTable
and DrRacket).

While I like C#, the promise of quality cross-platform software with it is
mostly a boondoggle. The hoops you have to jump through, and the state of the
dev tools for Mono, just push me towards Java anytime I need a cross-platform
desktop GUI app.

And that's sad. Because it's not like Java does a particularly good job of it,
it just does a site-better job of it than most anything else. I don't have a
good enough handle on the C toolchain to pick up and run with Qt or GTK and
cross compile for every platform. And nobody pays enough attention to desktop
in basically any other language.

Please, correct me if I'm wrong, because I'd really, really like to be wrong
here. I suppose I could do [Pythong|Ruby|OCaml|Haskell|Racket]+[GTK|Qt], but
it feels grating. It doesn't match. As far as I can tell, there is no GUI
library that works well in functional languages--even a wrapper on top of an
OO one. But again, correct me if I'm wrong. Please.

Other than that, I wish I had ditched SQL Server a long time ago. Postgres is
just as easy to install and use now, and has been for several years. I wish I
had the balls to replace my clients servers with Postgres and just not tell
them about it. They probably wouldn't notice.

I wish I had never wasted time on Python.

I wish I had kept gaming to my Playstation and stuck it through with Linux
back in 2000.

I wish I had not gone to college. Going to college meant I had to get a job
that paid well to service my debt afterwards. And for where I lived, that
meant I had to buy a car. Even still, being 22 years old and having only $35k
in debt was far better off than most of my peers, and even better still than
most of the kids graduating today, so I guess I'm not too badly off. But
still, I think about the last 10 years and really wish I had been writing all
of that software for myself rather than The Man.

What the hell was the point of writing all those projects in college for the
command line? 4 years of wasted practice on an interface only other
programmers care about. It is such a fundamentally different paradigm, and
most of my peers didn't transition well. _I_ didn't transition well, and I've
been either the most successful person or at least in the top 3 of my
graduating class.

I wish I had never stopped doing screwy shit in JavaScript. There was stuff I
wrote in 1997 that people are pushing today as "the power of HTML 5!" If I
stuck with it, instead of listening to my "betters" at work or in college,
then I think I could have contributed a lot more.

So, less about what specifically I would have studied, and more about not
listening to what others have to say about what I should have been doing.

------
chaudruc
Excel, Powerpoint, SQL

Business tools.

------
buzaga41
Sports.

------
this_user
"Scott Hanselman is a former professor, former Chief Architect in finance, now
speaker, consultant, father, diabetic, and Microsoft employee. I am a failed
stand-up comic, a cornrower, and a book author."

A Microsoft employee talking up C#, what a surprise.

~~~
d0
To be fair, he does kick them down regularly on a lot of stuff. C# is one of
the better bits of the Microsoft ecosystem.

