
Ask HN: How to switch from front-end to back-end - bloomca
Hi!<p>I am currently a solid frontend developer (which is pretty laughable to say, because my experience is just about 3 years), I know (to some degree, of course) you can say almost everything &quot;new and shiny&quot; (for regular apps, without graphics and etc) – popular bundlers, up to stage 1 features, React&#x2F;Vue&#x2F;Angular&#x2F;Cycle, all this state management systems, like Redux&#x2F;Mobx&#x2F;Rx and other, CSS with css-next, and so on. I also played with ClojureScript and Elm – and while it seems kind of cool, I don&#x27;t really see it as a solid option to bet on.<p>The thing is that I feel stuck. The new frameworks come up every month, a lot of people in JS community have pretty low CS understanding, and therefore the level of discussion seems pretty miserable. Moreover, I don&#x27;t really want to keep up with frontend, and want to learn something more solid. Not as solid as system programming, but I feel that back-end might be a good choice. But the availability of platforms is astonishing – and while I played some time with Elixir and Clojure, I feel that I should bet on Python and Go. I want to get a versatile language(s) (I know, it is not a good idea to stick with just one language, but I need to pick it up during the year; also I like to move between countries, so it should be in demand in general in Europe.<p>So, what can you recommend as a fast-picking language and what is the best to become familiar with the whole cycle – development, testing, deploy to the cloud, monitoring, etc (I only scratched the surface in all these topics, so I definitely need to solidify it). I am leaning towards Python&#x2F;Go (I wrote a small API for my side project in Go).
======
throwaway2016a
First start by defining "backend". It means something different depending on
the size of the project. Many systems now are three tier meaning front-end,
middle-tier, and backend.

What you probably want to focus on is the middle tier. In those three tier
systems the backend is actually very low level (data processing, storage,
replication, message brokering, etc) and is often handled by third-party
products such as database engines.

Some (many) projects combine backend-and middle tier as if they are the same
thing. And in some systems the middle-tier is very thin and just slightly
abstracts the backend.

So definitions aside... if you want to transition to middle tier...

\- Learn API development. Especially focus on REST and possibly GraphQL. Learn
the difference between a 422 and a 401 error, GET/POST/PATCH/PUT etc, etc.

If you want to really get into backend...

\- Learn hardware limitations

\- Learn Linux very well

\- Learn about job queues, Message busses, and interprocess communication

\- Learn about service discovery and the differences between eventually
consistent and strongly consistent

\- Learn about containerization

\- Learn about system operations

\- Learn algorithms. Including graph algorithms and how to determine
algorithmic complexity

Useful for both...

\- Learn SQL

\- Learn a few NoSQL systems... MongoDB, Elastic Search, Redis

\- Learn about security

Don't worry about specific languages. The concepts carry over to any language.
If you have to pick, Node.js, GoLang, Ruby, and Python are all acceptable
choices for middle-tier.

~~~
bloomca
Thank you for advice!

Actually, I know that language is not that important, but as I said, without
prior experience, I am afraid that if I will market myself as just a
"backend/software developer", companies will be afraid, and with a single
language it seems easier.

So, the best way just to pick a topic and go deeper, there are no resources
that cover them together?

~~~
samblr
Backend is full of rabbit holes.

So build something simple (blogger) which touches on primary concepts : api-
router, auth, access control, storage, db, cache, cloud, tests, continuous
integration & deployment. Even for a small app - one will have to make lot of
choices from existing components/frameworks/packages. So begin in a language
you are comfortable or you like to get a hang of concepts.

------
paulhodge
Honestly if you want to get out of your comfort zone and really start thinking
like a backend developer, I would recommend using a solid, proven platform
like Java. Specifically you could start with Java 8 & Spring Boot.

The differences between frontend & backend: frontend code tends to be more
loosey-goosey, less robust. Generally the goal of the frontend coder is to
write lots of features in a short amount of time. Backend development is more
"slow", you still want lots of features, but they need to be robust and work
correctly 99.99% of the time.

For that reason, I think the best way to think like a backend developer is
pick a language that doesn't have dynamic objects (like Python). I'm not
saying that Python can't work, I'm saying that using a static-type language
will help you outgrow any sloppy thinking habits that people tend to get when
they spend too much time in Javascript.

Hiring wise, Java is still a very in-demand skill. Tech wise, Java is an
extremely stable and proven platform that will serve any project well. It's
"boring" technology (which is a good thing). If you really want to change your
thinking, then try to stop gravitating towards shiny things and instead use a
"boring" platform.

~~~
artimaeis
I'd second this and throw the idea of jumping into C# and .NET. The .NET
platform is about as common as Java in back-ends, and seems to be evolving at
a more aggressive pace. C# is pretty great, and once you become familiar with
.NET as a whole it's pretty easy to gain skills in VB.NET and F# if those
interest you.

~~~
bloomca
Is not it too enterprise'y? Is it possible to find small (~100 devs) company
using .Net and C#?

And also, how much it will take to achieve some decent level (to be able to
work as a middle dev)? I think with Python 1year should be fine, what about
.Net?

~~~
artimaeis
It's not overly enterprise driven at all, from my perspective. The company I
work for has teams totaling to about 40 or so developers and we're completely
MSFT driven. From the DB side of SQL Server to web/backend of ASP.NET and
.NET. And my understanding of the industry is we're hardly alone. In my area
(the southeast US) there's plenty of opportunities at similar sized companies
or smaller.

Achieving an intermediate skill set in any language/platform will certainly
take more than a year. The language itself takes very little time - but
picking up maintainable (Clean Code, Pragmattic Programmer, etc) habits takes
a good bit longer for most people. Python probably has more beginner resources
available thanks to MOOCs and the like, but there's plenty of .NET intro
sources as well.

------
gregthompsonjr
Try using Django (Python) for a little while. You'll get exposed to everything
you mentioned because the Django core is feature rich. There's a lot of
support for Django—it's battle-tested and used by a large community of Python
developers. Out of the box, Django is a lot heavier than something like
Tornado or Pyramid, but if your goal is to work with a widely used framework
with lots of backend features to learn, I'd choose Django.

~~~
bloomca
Yeah, that's a good one. What would you recommend to focus – Flask or Django
(or maybe Tornado), given that I like to wire stuff by myself (so I enjoyed
building an API in Golang)?

~~~
dtien
I'd go Django first to understand the basic terminology, concepts, and
patterns that are used on the backend. Django is old, but feature rich as the
parent said, yet still heavy development and use. So the ideas and concepts
you'll get from it will still be very valid.

Than as you get comfortable you can branch out into the less meaty frameworks
like Flask or Go ( if you want to call that a framework ).

Remember, beyond the actual application server and framework, there's all the
other 'stuff' that goes around it. The web server, databases, caching
technologies, etc. Take the well travelled path first to see the best
practices, than go your own way if you really do want to 'wire stuff'
yourself. ( And trust me, even with Django there's plenty of wiring required
still to build a real app ).

------
dvdhnt
I'm currently a full time API developer using JS (Node), SQL (MySQL), and Ruby
(Rails) and whatever is needed for each new project.

\- My initial experience with "coding" was MySpace (HTML/CSS) which led me to
learn/experiment with JS.

\- Rails got me into API development because of all of its "magic" (even
though now I'm less about magic by far); but it was a step.

\- Having experience with HTML/CSS/JS made Rails easier as far as getting
something up and running because I already knew what my views should look like
and how to get them there.

\- This allowed me more time to experiment and get to know Rails, leading me
to discover a lot of terms and concepts I had to become more familiar with i/e
cacheing, server-side rendering, deadlocks, data-layer, and the list goes on
forever.

\- I realized the best thing to be great at, in my case, is SQL because
persisting and extracting data the way you want/need to goes so far in making
other things easier.

\- Finally, I started learning how to truly develop architecture, queues,
schedule, etc once I got a job on a team where my peers and supervisors were
willing to teach me.

Hope some of that helps!

------
jraines
I don't think you can go wrong with Python. I can't say one way or the other
about Go.

That said; it seems to me (as just one dev's opinion in the U.S.) that Europe
-- particularly northern Europe -- has a pretty healthy Clojure scene. Of
course, it's not going to compare to Python/Ruby/JS in # of jobs, but if you
liked it, I can tell you it only gets more fun as you learn more.

One general piece of advice -- internalize this:
[https://gist.github.com/jboner/2841832](https://gist.github.com/jboner/2841832)
(latency comparison of different operations) as one or two operations at the
wrong layer will overwhelm a whole lot of algorithmic cleverness.

~~~
ryandvm
I would be hesitant to aim anyone's nascent development career at Clojure. Not
that there's anything wrong with the language, but I think we've passed "peak
Clojure":

[https://www.google.com/trends/explore?date=all&q=clojure](https://www.google.com/trends/explore?date=all&q=clojure)

------
hluska
You've received some wonderful advice about some specific technologies that
you should focus on. In particular, the advice to develop strong database
skills is going to be particularly helpful.

I want to add that because you're experience on the front-end, your transition
to the back-end will be a little easier. The best way to learn how to design
an API is to consume many of them!!

Also, since already have front-end experience, you may find it easier to
transition from front-end -> full-stack -> back-end only. Your front-end
skills will be considered full-stack experience and when you're in a full-
stack role, you'll have an opportunity to learn some solid back-end
fundamentals!

Good luck with this!

------
retrac98
If you're familiar with JS then arguably the easiest transition route for you
would be to start building some node based services on the back-end.

It'll allow you to get to grips with some of the gotchas you get with back-end
development with an ecosystem you're already familiar with, once you've
conquered those you can then start branching out to other languages and
frameworks pretty easily with a solid understanding of back-end principles.

Another benefit of this approach is there's a huge demand for JS engineers who
are comfortable on the front and back end at the moment, so it sounds like
you're in a great position to spread your wings.

~~~
bloomca
Yeah, basically we don't have node.js microservices, but sometimes I add
endpoints to our node.js server with server-side rendering.

Also I am trying to create my side projects, but as I said, I suffer from not
solid knowledge, so I feel that I am doing some wrong and unnecessary work all
the time.

------
marcosdumay
What is your goal?

If you want to land a job as fast as you can, you should get a team-enabling
language like Java.

If you have some project you want to get done but need backend knowledge for
it, go with a mature high productive toolset. Choose either Python+Django or
Ruby+Rails and grow from there.

If you want a new area where you can have fun and learn new stuff, go wild
with non-mature high learning curve tools like Closure or something even less
mainstream.

If you have some very specific requirements like high availability, high
concurrency, or whatever, ignore everything above and choose your toolset
based on those.

~~~
bloomca
I want to change my current development role and put myself into different
position to the end of the year. I want new challenges and I want to try to
work in different environment – from sandboxed browser to real servers (or
containers), with different security model in my head, to work with databases,
and I'd like to work with distributed system as well.

~~~
marcosdumay
So much stuff, so little time.

I think you should take a VPS, one of (Django || Rails), do a small project
all by yourself, and decide if you want to go deeper on any of those things.
The alternative is to learn Java and go quickly into an entry-level job, but
you won't be able to choose what to learn by doing that, besides the small
project will help you learning Java too (but may make it unbearable).

------
amorphid
I went front recruiting w/an MBA to backend, so I'm pretty sure you can do it,
too :). Not sure I have any generically useful tips beyond spending more time
doing backend stuff. Write an API that a frontend can talk, figure out how to
deploy a Docker container, learn SQL, etc. Backend is a pretty broad term that
just means "not frontend".

Happy to chat 1 on 1 if you like. Email in profile.

------
ma1069
If you already know frontend programming fairly well, why not going for
Node/Express and re-use part of what you know? You will just have to study new
coding approaches without having to change language as well. Once you learn
how to write APIs in one language, switching to another one is pretty simple.

~~~
bloomca
To be honest, I'd like to avoid Node.js train at all. Of course, I have some
experience creating server side rendering and adding small features like
authorization, but as I said, I'd like to dive into different communities and
change my environment.

------
lenguyensy
All I can say is to learn the spec. Like how REST works and pick a language
and go deeper into it.

If you want to be on the safe side, go with Java.

It's there and will never die.

You are right with FE technologies keep popping up. But you will have the same
issue in the BE. New BE technologies are born to solve a different problem
space such as scaling, performance, or things of that nature where as FE is
more focused around HTML, CSS and JS.

Overall, learn generic concept which are transferable regardless of stacks
such as NoSql db such as mongodb, Relationship db such as oracle db, caching
with Redis or memcached, message queue such as kafka, text indexing such as
elastic search, stream processing such as storm, batch processing such as
spark, and a ton of machine learning.

With that in mind, BE is aslo rather bloated, but it evolves around more area
of concerns and not just CSS, HTML and JS

------
pawy
Learn how is composed a request, how to build it and how you read it. Iterate
on architecture rather than on features. Try out all of them, take only what
you need from them.

Check out and learn how to use Docker and the docker-composer ; Check Python &
Ruby, choose to one you prefer. To me they are really great for database
management (migrations) and administration; Lot of big websites use it in
production.

Learn how to use a cache and understand why it is useful.

Check out GoLang and build your self a simple server. (Auth is great for a
first approach of golang, i've been on it this week and everything is pretty
much worked out by public libs) ;

Get back to SQL

------
xiamx
Given that you are familliar with Javascript already. You can pick up nodejs
easily. Using nodejs for a while will give you an idea of what backend
development's daily life look like.

Once you understand the common tasks that are involved in backend development,
it will be easier to switch programming languages. Python is a good choice for
example, it is very versatile and has been used to program various backend
server. It is also being used extensively in scientific computing, machine
learning and etc.

~~~
bloomca
Yeah, basically I can use node.js almost instantly for writing actual backend,
but as I said I'd like to avoid it. I want to broad my programming horizons
via using new language, new environment and exploring new community – I know,
all of this is possible via side projects and open source, but it is still a
different thing.

------
gigatexal
While I don't have your expertise in front end development I share your
sentiment and I, too, find myself prone to backend development than anything
else.

Python is a great language used often in systems programming. It's also a joy
to code in.

Rust is intriguing is check it out. The build and package system is robust.

Go is great, too.

Basically you're on the right track. Now maybe just do some study on concepts
like paxos or the CAP theorem. You might look into databases both relational
and not as back ends often involve those.

~~~
bloomca
Yeah, actually, I listen to some podcasts, and one of them touches distributed
stuff pretty heavy, so I've heard about quorum, consensus, paxos, etc. But it
seems too heavy, so I think it is much easier to enter the market through
fullstack/API developer. Same story for cloud/infrastructure – I hope to go
into not very big company and to touch all of this stuff.

~~~
gigatexal
Which one? I'm looking for one in that space.

I spend most of my day listening to podcasts. I'm glad I found them again.

I like the changelog, talk python to me, python bytes, Mac OS ken, the packet
pushers network (networking centric even though I don't know much, Greg Farrow
and company are hilarious), and software engineering daily and programming
throw down, to name the ones I know off the top of my head

------
merb
By learning a real programming language?

Well basically that was a joke, however a lot of stuff is different on the
front end than on the backend. Not everything has a main event loop and async
programming is not really there in many spaces. Depending on what you are
doing you would need to learn a whole new programming concept, which is not
that far off from my initial statement.

------
pedrorijo91
I would say Node, Ruby, Python should be the easier for you to get started.

Node: you already now JS, the ecosystem, and the idiomatic ways to do stuff.
You can focus on the differences between FE/BE

Ruby: It's easy to learn, also dynamic typed, and Rails it's a very good
technology to start with backend/MVC

Python: Also easy to learn, also dynamic typed. I never played with Django..

------
dagss
You ought to ask yourself "which database do you want to learn". Make sure
database transactions, consistency etc. becomes your native tongue. Being
familiar with SQL and Postgres (or similar) is just as, if not more, important
than Erlang vs Python vs Go.

~~~
bloomca
So, should I know the details of how, let's say, PostgreSQL works, or just
normalization forms with effective analyzing of SQL queries is enough?

I know the basics, but how deep should I go, if I want to be a serious
developer?

~~~
dagss
Make sure you know about database transactions and the various ways they can
be configured and what effects it will have on data consistency. That way you
will not make code that seems to work but which randomly corrupts data. That
is the most important thing of all.

Beyond that I would go with learning what you need on whatever job you get,
just be aware that choice of DB is just as fundamental as what programming
language is used to a backend project.

------
eranation
As a front end guy (I started as a graphic designer, learned HTML, then
JavaScript, then Flash/ActionScript, back to jQuery, Backbone, Angular 1) who
moved to backend, my advice is - pick anything that you feel comfortable with.

You have several planes of "moving to backend" and I will try to go over them
categorically

1\. Language: not a critical choice, but since you come from a JS background,
I would stay with JS. I'd start by deciding to focus on NodeJS and that
ecosystem. I wouldn't switch to Go/Python unless you have an urge to learn a
new language. Moving to backend dev has many aspects to it. New language is
not the most important one. Few aspects of languages do matter though, you
have "lightweight threads" in Go (channels), but not in Java (unless you use
Quasar). Node is not exactly multithreaded in the literal sense of it. Each
language has it's own abstraction around async computing, Scala/Akka futures
and promises slightly different than Java's futures and promises, which are
highly different than JavaScripts Promises.

2\. Paradigm. learn both best and bad practices, patterns and antipatterns.
Good to know some GoF design patterns, but also learning about functional
programming, immutable design, reactive framework (RxJS for example). You will
find out some of the front end philosophy is there in the backend too. Good
design, OOP or Functional, has similar principles (single responsibility,
loose coupling)

3\. Databases If you want to do backend, you'll most likely need to have an
understanding of how databases work. From basic RDBMS principles, transaction
isolation, ACID principles, to NoSQL, CAP theorem, Big Data etc. Learning SQL,
Hive dialects etc is in my opinion an integral part of backend programming.

4\. Security - you must understand a lot of aspects in security, from why not
use MD5 to hash passwords, what is a salt, a pepper. what is Kerberos, client
SSL, and why we should stop saying SSL when we mean TLS. Why you should never
use DES, why you should rather not store passwords in Java as Strings but
rather as char array. How to sanitize user input, and do server side
validation, preventing XSS / SQLI. What is CSRF and how to handle it on the
server side. What is cookie based authentication, vs JWT. SAML, OpenID, Oauth
principles. etc etc. Security must be baked into the process from start to
end.

4\. CS - as others have mentioned. Basic data structures and algorithms is a
must.

5\. Some basic OS stuff. you should know what is a page fault, virtual memory,
and how OSs work in general. Caching and distributed caching, caching
invalidation etc. Unless you do graphics on chips or something, then
eliminating branching using bit twiddling is something I would skip... also
cache alignment, unless you really are doing some really realtime stuff.

6\. Learn architecture, especially, microservices, serverless, SOA,
monolithic, 3 tier, what is a 12 factor app, what is distributed computing
etc.

7\. Learn devops and infrastructure, whether its on prem, AWS, GCP, or Azure,
learn concepts such as infrastructure as code, CI/CD, configuration
management, Puppet/Chef/Ansible. Docker and containers, Kubernetes, Mesos.
This includes learning command line.

8\. Learn basic networking. Don't lower than level 3 if not needed, but know
how the network works

------
rchargoy
i always think, each one require a lot of knowledge, but it's easier change
from front to back, depends of the language

------
Scarbutt
Not a fan of Python, but its vast ecosystem of libraries makes it a very
pragmatic solid choice.

------
ebbv
I think you might be suffering from a grass is greener situation. The web
development community as a whole is unfortunately very obsessed with new an
shiny. New frameworks and new languages come up fairly regularly and people
jump all over them assuming that they are a solution to their problems. I
think this reflects the fact that web development has the lowest barrier to
entry of any programming field (there is a ton of demand and it's relatively
easy to write basic things like WordPress modules or whatever) and so young
and inexperienced developers flock to it. (Which is not to say all young
people think this way but I think it is more common among inexperienced
developers.)

Personally I find that the way to avoid chasing new and shiny all the time is
to work for a good organization that recognizes that is not the best way to
have a stable and solid codebase.

In other words, I think the solution is not so much the position you have as
far as front end vs. back end but where you are working.

~~~
bloomca
Personally I feel it is not really about "grass is greener situation" (though
of course it contains part of it). What I want is to be a better developer, to
learn new platform, to get familiar with Linux, with processes, with
infrastructure and so on.

Working as a front-end developer, you are pretty isolated, and while it is
possible to communicate with other departments (what I do), it is still seems
like a different level.

So I want to shape myself as a better software developer, along with trying
new field.

~~~
ebbv
If you want to really learn Linux and infrastructure stuff then you should
become a systems engineer not a back end developer. Back end developers rarely
become experts on those topics, since they are at least one layer beneath our
area of concern usually. Even if you are working at a small shop chances are
you will outsource those kinds of concerns to a hosting company like AWS.

------
british_india
Nearly every new programmer starts in the UI. Then, when you discover how
annoying that can be, you CLAW your way out of it. I would recommend you know
a backend language such as Java, .NET or Ruby. Learn it well.

~~~
bloomca
Java and .Net both seem too enterprise. I'd like to make the transition during
the year, so is it possible to get a job despite not having experience in such
fields? Scripting/"Startup" languages (like Go, Python, Ruby) seem much more
easier to get a job with not so solid experience.

~~~
rpeden
Be careful about that enterprise assumption. I've worked for two startups in
my career. The first used mainly Java, and the second used mostly .NET.

Heck, lots of companies you'd consider to be enterprise are building cool
projects with React and Angular 2 front ends hooked up to Java or .NET on the
back end. Projects like those might be a decent way for you to leverage your
current experience and work your way toward back end development.

