What kinds of things can you do as a professional programmer?
It’s hard to give a quick answer to the question, “What should I learn if I want to be a professional programmer?” There’s a wide variety of things you can do as a programmer, and what you want to focus on affects what you should learn. If you want good career advice, you need to know the kinds of things you can do, and what kinds of work you’re most interested in.
- General Programming
- Web Development
- App Development
- Data Science
- Machine Learning
- Artificial Intelligence
- Business Software Development
- Game Development
- Freelance Work
- System Administration
- Embedded Software
- Domain-specific Software
- Financial Trading
|« My background||How long will it take to find a job? »|
While there are many who might consider themselves to be generalist programmers, there aren’t many jobs for generalists. People usually get hired for more specific roles, such as web development or data science work. So by all means continue to improve your overall programming skills and knowledge, but consider a more specific area to focus on when looking for work.
Web developers focus on building and maintaining interactive web sites. Web sites have been interactive for a long time now, but the technology behind them is constantly evolving. As a web developer you can work on simple sites that allow users to upload specific kinds of data, or you can work on projects that are basically full desktop applications delivered through a browser.
Web development is often broken into front end work and back end work. Front end developers focus on the interface that users see in the browser. They try to make sites look appealing on the full range of devices available today, and they try to make sites respond quickly and smoothly to user input. Back end developers focus on data management and server-side processing. This usualy involves a strong understanding of working with databases and APIs. Full-stack developers work on the front end and the back end, and can build full working prototypes of web sites independently.
You can find work building new sites, or maintaining any of the millions of existing interactive sites. You can work on small development teams, or you can be part of a large corporation responsible for some of the largest and most popular sites on the internet. There’s also a lot of web development work that’s done entierly on internal networks, for apps that are used exclusively within an organization.
App development is closely related to web development. Many app developers started out as web developers, and many web developers end up building apps at some point. App development usually breaks down into iOS and Android development, although plenty of people still spend time building desktop applications.
If you want to build iOS apps, you’ll be using Swift and XCode. If you want to build Android apps, you’ll be using Java or related lanagues like Kotlin. You’re not wasting your time learning Python, though. For one thing, Python is a much friendlier first language than Swift. The fundamentals of programming you learn through Python will serve you well when you start digging into other languages like Swift, Java, or Kotlin.
It’s also beneficial to know Python as an app developer because many apps talk to a server on the back end. You can store some data on the user’s device, but often times data needs to be stored externally. For example, any interactions between users need to be processed through an external server. Off-device backups need to be saved to an external server. When you hear that an app’s data is “backed up to the cloud”, it really means that data is stored on an external server as well. To write your server code, you can build a Django project that handles all of the external server interactions. For example, the Learning Log project in Chapters 18-20 could serve as the back end for an iOS app and an Android app. You’d need to build an API for the project, and then the apps would each talk to the Learning Log API to read and write the user’s data. When people want to access their learning logs, they could then choose to go to the web site, or use an iOS app, or use an Android app.
Data science is a broad field. Data scientists collect, clean, analyze, and visualize data. They can work with small data sets that can be processed quickly in RAM on a single laptop, or enormous data sets that require careful planning to process efficiently. They can work with largely static data sets, or real-time feeds with large amounts of data coming in quickly, 24 hours a day.
A good data scientist also helps make meaningful decisions based on the data that’s been collected and analyzed.
Machine Learning is an advanced case of applied statistics and data analysis. ML refers to the process of identifying rules and parameters about a certain problem, that allow a computer to get better at addressing that problem over time. There’s nothing magical about this work, other than being impressed at how many calculations can be done in a short amount of time, and how much work people have done in this area over time.
If you want to work on ML algorithms, you’ll need a really strong background in math. If you want to apply ML techniques to specific problem areas, you’ll need enough of a math background to have a high-level understanding of how ML works, but most of your work will involve adapting existing ML libraries to specific problem areas.
Much of what is sold as artificial intelligence is really just applied statistics, or Machine Learning. True AI, or general AI, is still a far-off goal. Nevertheless, people are working on this problem area. If you are interested in working on true AI, you probably want to look for a research-focused organization.
Business Software Development
Business software development covers a broad range of work. Almost every business in operation has some need for software development. It’s safe to say that every business has some inefficiencies in some of their workflows, and these inefficiencies are opportunities to automate processes. People often assume the main benefit of automating processes is the time that’s saved. But there’s just as much benefit from developing consistent processes - processes that are less error-prone, and give more confidence that results are accurate.
If you want to focus on business software development you can work within a single company, focusing solely on that company’s needs. Or, you can work in an agency that does contract work for other companies.
This kind of work is a great way for people already working in a field to transition to software development. If you are already employed in a non-programming job, there’s a fair chance you know some inefficiencies in your company’s workflows. You may be able to write code that addresses these inefficiencies; this is how many people start to write code that’s used in a professional context. Be careful though, because software that’s not fully thought out and tested can cause major disruptions to a company if it does something wrong. And these issues can be hard to spot, because everybody assumes that since the process is automated, it’s being done correctly. A small error can cause big, costly issues, and you don’t want to be responsible for that as your first professional programming experience.
Game development is one of the more popular anticipated careers, but it’s also an area where reality is often far from what many people imagine it to be. A lot of game development work is not nearly as appealing or lucrative as people tend to think it is.
Many people think being a game tester means getting set up with your own high-end gaming rig, and getting to play the newest games before they’re released. It actually means writing code to test certain aspects of the game (see Chapter 11), and playing through very specific parts of a game repeatedly to test for glitchy behavior. This can get really boring, compared to actually playing a finished game.
Many game development companies also have a reputation for pushing their developers really hard - demanding they work many more hours in a week than is healthy, for weeks and months at a time. And in the end, these developers usually don’t get the financial reward that comes from building a massively popular game. Some game dev shops are even proud of how hard they drive their developers, and use that in their advertising.
Another source of frustation in the game development world is that people go into the field thinking they’re going to do creative work building fun, amazing games, only to find their day to day work comes down to trying to make users click on in-app purchases. Not many people go into game development wanting to implement dark patterns, but that’s what a lot of people (unhappily) end up doing.
That said, if you are interested in game development, do some research. There are good games being produced, and if you can find a shop that treats you well, it can be really satisfying work.
Another area of game development that’s really appealing is being an independent developer. This is appealing because you’re in full control and you will reap the rewards of building a successful game. However, it takes a lot of work to build a well-polished, well-designed game, and it means you need to take care of things like artwork and marketing yourself. The app stores are flooded with games now, and it can be really hard to stand out even if your game is really good, and built really well.
SaaS stands for Software as a Service. This is what often takes the place of desktop apps on current devices. Instead of building a piece of software that users install on their computers, you build the functionality on a server, and you provide a way for users to intereact with that software - either through a browser, or through an app. You run the software on a server, and you offer this as a service to end users.
There are many advantages of this model over the older desktop application model. It means you don’t need to deal with distribution; users might need to download an app once, but they don’t need to download the full application. If you have a bug in your server software, and you fix it, you know that you’ve fixed that bug for all of your users.
SaaS projects can be really simple, like photo-sharing apps and to-do apps, or they can be really complex like office suites. You could turn the Learning Log project (Chapters 18-20) into a SaaS project, if you could build it out in a way that people would want to pay for it.
There are a number of common business models for building SaaS projects. You can offer users a free trial period, and then require them to pay in order to continue using the service. You can offer your service free up to a certain amount of usage, and then charge users who go beyond that level of usage. You can have a limited free version of the service, and charge users who want access to the full set of features. You can offer the entire service for free, and hope it gets popular fast enough to attract funding which will let you build out the platform. This is the VC (venture capital) model.
Running your own SaaS project is appealing to many people. If you have a good idea for a service you think people might pay for, you can build a working prototype and then see if people are interested. It’s important to put your prototype in front of people early; it’s easy to fall into the trap of spending years building your project, only to find that no one is interested enough in your service to pay for it. You can also join a team for a SaaS that’s already being built.
A common way to come up with an idea for a SaaS project is to watch how people in a certain field use spreadsheets. Many individuals and businesses use spreadsheets to manage their organizational data. This works, but it’s often a more inefficient and fragile workflow than many people realize. Many of these workflows involving spreadsheets can be turned into SaaS projects, which can then be sold to users in similar fields.
Many people who are new to programming dream about working as a freelancer. It’s an appealing vision - you get to be your own boss, set your own hours, choose the projects you want to work on, and get paid well. But the reality is often quite different, and isn’t usually a realistic option for people looking for their first programming job.
Freelancers do a lot more than write code. They have to find work, handle all communications related to a project, handle their own accounting or pay someone else to do it, pay self-employment taxes, and deal with difficult clients without the backing of a company that you work for. Plus, you have to be able to handle the entire life cycle of a project - finding clients, defining a clear scope for each project, developing a meaningful contract, handling changes to what was originally asked of you, responding to critical feedback, and making a plan to maintain the project. This is something most people need a fair amount of experience with before they can do it on their own.
If you’re interested in freelance work, you might look at joining a freelancing agency. This is an umbrella company that finds clients, scopes projects, and signs contracts, and then subcontracts with freelancers to implement these projects. The company handles a lot of the logistics involved in freelancing, and you get to focus on building out the project. These agencies often prefer people with some professional experience, but if you’re interested in this kind of work it won’t hurt to talk to some of them early on in your career.
System Administration has often been seen as separate from programming. But there is so much automation involved in sysadmin work, that many system administrators end up learning to program at some point. If you’re just starting out in the technical world, you might find that you really like sysadmin work. You’d be responsible for building and maintaining technical infrastructure. For example, you might work on a SaaS project, where you’d be responsible for the deployment infrastructure. Or you might work at a large company where you’d be responsbile for maintaining the organization’s network, and much of the hardware on the network.
Almost every electronic device available has some software on it. If a device runs software but has no way to attach a keyboard and monitor, the software it’s running is called embedded software, or firmware. A good example is the software that runs on a printer.
Embedded software is a really interesting field to work in. It’s more important in this area than many others that your code is correct when it’s released, because many users rarely, if ever, update the firmware on their devices. If you make a mistake as a web developer, you can fix that bug and push the fix to all users as soon as you update the site’s servers. If you work in embedded software, your end users won’t see the fix until they choose to update their firmware. Some people like the challenge of writing software that functions on its own like this - it can be really satisfying to think of thousands or millions of copies of your code running untouched and unmodified, for years on end.
Embedded software is everywhere - on printers, ovens, microwaves, clocks, amplifiers, cars, medical devices, satellites - the list is literally endless because new devices are being invented every day.
Domain-specific software refers to software that’s written to solve a problem in a specific domain, or field of work. Some examples include scientific software, medical software, and real estate software. Many people who make a mid-career transition into software development focus on this kind of work, because they already have the domain expertise.
What’s the difference between domain-specific software and software that’s written by a general programming agency? Domain-specific software tends to require expertise and experience working in the domain. For example, consider the software used to run the Large Hadron Collider; you probably need a deep understanding of particle physics to write software that can run a large particle accelerator safely and effectively. The team writing this software would have some people who are stronger in physics and some who are stronger in software development, but everyone on the team probably needs some expertise in both areas.
If you already have expertise in a non-software field, you should seriously consider this type of work. There are often opportunities for you to start solving problems in your domain at your current organization, if you are already employed. Just be careful, as it’s easy to automate something and end up with some unintended consequences that you might be responsible for.
People have been writing software for robotic applications for a long time, and this work is only getting more interesting. If you’re interested in working with robotics, you can focus on low-level code that makes efficient use of physical devices, or you can work on higher-level code that aims to solve real-world challenges.
As an example of lower-level code, you might work on stabilization software for drones. What’s the highest wind a drone can remain stationary in, given a certain set of physical constraints? How quickly can the drone handle changes in the wind’s direction? How well can the drone handle the momentary loss of a gps signal in windy conditions? These are all low-level problems that apply to most drones being built today. An example of higher-level code would be developing software that allows a drone, or a fleet of drones, to build a high-resolution map of a city.
Robotics includes many things that don’t traditionally “look” like robots: drones, autonomous vehicles, personal assistants, toys, submersible rovers, extraterrestrial rovers, and much more.
If you have really strong math skils and love money, you may want to get into financial trading software, also known as algorithmic trading. This kind of work tends to be high-stress, but if you do it well it can pay really well.
There are no shortcuts in this field; if you think you’ve thought of a way to game the system through code, then what you’re thinking of is probably illegal, or will likely lose all of your money faster than you can imagine.