What All New Software Developers Need To Know

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
i recently asked people on twitter and linkedin to give me their advice that they would offer to new developers that were just starting out and it prompted some great responses from a bunch of experienced developers so i thought it would be nice to assemble that into and collect it together and add some of my own advice um so if you're just starting out in software development if you're just beginning your career here's some advice from people that went before you [Music] hi i'm dave farley from continuous delivery if you haven't been here before please hit subscribe and if you enjoy the video like it and check out some of the others on the site welcome first of all i'd like to say welcome i think that you've chosen a good industry to begin your career i have been a software developer for a long time and i think this is a fantastic industry we are changing the world we are the people that are modifying the world it's creative it's challenging it's disciplined there's all sorts of fascinating aspects to this and and ways to learn so my first uh first thing is i think you've made a great choice there were some people that wanted to be farmers but i think i think this is a better choice one common piece of advice that nearly everybody offered in some form or another is to recognize that everybody's a junior at something um i've recently been learning to for an exercise that i'm carrying out to to programming angularjs i've not used it before and so everybody is always learning that's part of our discipline and part of the things that i think in some ways differentiates us from from other industries this is so this is always true which kind of leads me to my first piece of advice and maybe the most important piece that i have to offer it's okay to say i don't know in fact it's more than just okay nobody knows everything software development as a career is vast and extensive it's a whole topic it's like saying you know all of physics but maybe even more so there are so many different um corners and angles and technologies and disciplines involved in software development that nobody is an expert at all of those things more than that though more than that not knowing is kind of fundamental to what it is that we do we are always creating something new we are always in a kind of exploratory mode we are always learning and discovering and trying to figure out what is this problem that we're trying to solve how is it that we're going to try and solve it how we are going to apply these tech technologies to solve this problem and what are the right technologies that we're going to use to solve this problem that's nearly always the game that we are in so not knowing is not something to be embarrassed about it's just the way in which you're going to spend the vast majority of your career and that's kind of one of the joys it gives you an opportunity to to learn and discover new things all of the time um it's actually good to fail it's a positive thing we learn uh when we when when we try things out and they don't go as we expected this is one of the lessons that we learn from science my discipline the the the way that i talk about software development i believe is about apple applying scientific rationalism to solving problems in software and i call that a genuine software engineering discipline and in science the most powerful attribute of science is that idea of of being able to fail and learn from your failures if my experiment goes in the way in which i predicted then i haven't really learned anything new if my experiment goes wrong then now i'm learning something fascinating and new and i can open up whole vast areas of new discovery but when we're producing things particularly for commercial organizations we need to learn how to fail and we need to fail in a way that's not necessarily going to damage us we need to learn to be experimental in the way in which we work so my advice to you is to get comfortable with not knowing because that's going to be the usual state what that means is that you need to become disciplined and expert at the techniques of learning focus on the stuff that's before you right now what matters right now focus on that and apply these learning techniques to solving the problems that are in front of you working tiny steps if we want to limit the danger of failing of making a mistake then we want to be able to make those mistakes on a small scale so if we divide our work up into small tiny tiny units of progress then we can make those units of progress or not and if we find out that our step forward wasn't actually a step forward it was a step backwards we can discard it with almost no cost and that is the most powerful most interesting way of learning as an aside if you haven't been following elon musk blowing up spaceships that's precisely what he's doing in trying to develop spacecraft that can fly to mars he's doing practical engineering and learning by making mistakes work always on to try your ideas out never assume that your guess is correct rather another one of those lessons that we can learn from science be suspicious of your own ideas and your own guesses in fact be suspicious of everybody's ideas and guesses always test the ideas before you always test the assumptions that are that go into the things that you're that you're doing so what is it that makes me qualified to offer you any advice at all um i've been a professional software developer for over nearly 40 years and during that time i've written a lot of software of different kinds um i am one of the authors of a fairly successful book called continuous delivery that describes the current state of the art for software development that is widely practiced in organizations that we think of as being successful in in our industry google tesla amazon netflix those sorts of organizations all practice a form of continuous delivery i was in involved in the creation of a a successful open source project and in building one of the world's highest performance financial exchanges during the latter part of my career i was in fairly senior positions and so i interviewed all technologists that came into those organizations so i've interviewed literally hundreds of developers in my time so i think i think that that puts me in a position to have some kind of view onto on what our industry is and what it's like to begin in it oh and i'm also pretty opinionated when it comes to the topic of software and software development so i think that gives me an opportunity to offer you some of this advice so moving on to more of that advice my next bit is really look for mentors look for people that can help you develop your career and help you to learn my first version of that piece of advice might be tricky it might be tricky to apply but where you can look to choose your own bus when you go for an interview for a post or a job you should be interviewing the organization that you're applying to as much as they are interviewing you of course there's a there's a difficulty when you're just starting out and trying to get your first job but if it's possible if you have a choice between two two different uh offers look to the one with the the boss the person that interviewed you whoever it is who gave you the impression that they're going to help you to develop and learn that's going to be really important if you're working in an existing organization look around your organization look for the teams with people that are led by people that you admire and that you think that you could learn from and figure out if there's a way in which you could ask to work on that team for a little while take your learning and your career development seriously again if you're in a position where you're offered two jobs and one of those jobs they they're practicing pair programming in another don't my advice is go for the job where they do pair programming i don't know of a better way of teams learning than pair programming and i would advise you to take it seriously and and treat it as a real plus if you can find somewhere that works that way certainly in my career when we were building the high performance financial exchange that i mentioned we were practicing continuous delivery testing development pair programming all of those kinds of things and when a new person started on the team on their first day they would be working on code that would be going into production at the end of the week and that's a great feeling and a great learning experience it also means that they were working alongside senior developers who were more familiar with the code base and so good actors guides to the code base pair programming is a fantastic way of learning so i would i would value that if you come across it if you can't find these things the the substitute for these maybe i'll look to join meetups or groups that are that are interesting to you in the technical area that you're working in look for programming communities around the technologies that you use consider making contributions to open source software systems now all of this sounds like the kind of advice that unpleasant bosses will give you is work harder in your own time and there's an element of truth to that software development is one of those careers where people get obsessed by it and love the act of programming and so you're going to be competing with people that do practice this as a hobby as well as a job so at least you want to be able to com become familiar with the tools and the techniques and i'm not suggesting that you spend all of your spare time working on these things but the more that you can kind of play with this stuff the better it's going to be my next piece of piece of advice is really a theme for for all of this uh this presentation which is it's not all about code and tools those aren't even the most important things but i think often we get blindsided and we think that we are software development is much more about understanding the problem that we are working on and so developing the skills that allow you to analyze problems and understand what's happening are is important draw pictures that help you visualize what's going on i'm a very visual person and so do i tend to do sketches on pieces of paper to try and understand the problem talk about the problem with with others software development at its best is a much more collaborative exercise than we often give it credit for there's research that says that the most clearly identifiable characteristic of high performing software developers compared to others is that they talk to other people more it's not about the tech that you use or anything like that it's about learning and understanding the problem think about how the software that you are developing is used think about your software from the point of view of the person that's using your software it's surprising how many software developers don't do that and it will give you definitely give you a step up in your value to the organizations that employ you if you do software development is a is an exercise in creativity and we often don't think about it in those terms but it certainly is and human beings are at their most creative when we are relaxed and play for and collaborating with other people so that's the kind of work environment that you want to prefer and try and facilitate you want to try and collaborate and find ways of working today your real job is not coding despite the focus that most people starting out have on the tools and the technologies that's not the real job your real job is problem solving and so learn the techniques to become great at problem solving and the coding will come along with that it will follow so i've just said that it's not all about coding tools but code's important so let's talk a little bit about code my first piece of advice start with if you're starting out is write lots of code play with it do do silly things with code try all sorts of different things i used i started out writing games and i would just write simple little games for myself and but do whatever it takes whatever interests you but but play with ideas don't just focus on the things that you are you know that you are that you are forced to do as a result of your job try and find ways of exploring around the edges of that try out ideas related to the code that you're writing maybe but play with the code and that way you develop deeper skills and and broader understanding of of of how to apply them if you're looking to for some inspiration in that space i have a few recommendations to you the first one is called cyber dojo and here's a link um and the idea of cyber dojo is a place to practice test driven development but one of the side benefits of cyber dojo is that it's got a whole list of coding carters simple little exercises that are presented in a variety of different programming languages i very strongly recommend that you try the test-driven developments approach to exercising these coding exercises but still it's it's a it's a great utility to go and fly fine play with those and it's it's free to just go and use for your own your own learning the next one that i particularly like if you're a bit nerdy like me and interested in science and maths and that kind of stuff there's a great site called project euler which is a series of mathematical problems that you can solve using software and it gives you the outline of the problem and then you're on your own to try and figure out how to solve that which is which is great again for playing with code and coming up with some ideas and again i encourage you to do that using test room development but we'll talk more about that in a minute and lastly if none of those neither of those appeal to you here's a link to a site that's got a variety of different resources linked from it to for for people to to to inspire people for to write different pieces of code so so take a look at this and this might be helpful to you what's the difference between a great programmer and a bad programmer it isn't the language that they use and it isn't how fast they can type it's how well they can divide the problem into pieces it's how you separate out the complexity of a problem and simplify it so that you can work on it that's the real difference between the great and the bad programmers so those are the skills that you want to look um to develop take ideas like modularity separation of concerns cohesion seriously and learn about those apply them whatever you're working on learn the fundamentals and apply them everywhere learn test driven development apply the techniques because that helps you develop a series of other good habits as well as test driven development itself working tiny steps remember we talked about being experimental and making progress in small steps apply this to the way in which you develop and write your code compartmentalize the problems in a way so you can manage these small steps and test them using a test drive development be disciplined about organizing the information that you work with and the software that you are building think about how you organize your disk you don't just put all of the files in one big folder because you can never find it it's hard to find them then you've got to search it's more complicated you tend to organize them you decompose them into more related things this is applying the ideas of modularity and cohesion to information apply those ideas everywhere that you manage information the fundamentals that i've started talking about are deeply important we talk all of the time about our industry being an industry of change and yet those fundamentals don't change they've been true for the nearly 40 years that i've been involved in software development and they will be true for at least the next 40 or maybe 400 years they are fundamental to the way that software works um and so this is where the real value is focus on these things and you will become a better software development developer unfortunately recruitment doesn't always work like this and so recruitment often works by having checklists of technologies or experience that you've been through particularly in the early days because it's hard for people just starting out to demonstrate their capabilities other than in these simplistic terms but this is stupid this is really not going to tell the people that are employing you or you what's valuable good software developers use computers as tools i wouldn't interview a carpenter and focus on what kind of hammer they use i'd be more interested in the kinds of things that they build and how they think about building those and how they think about solving the problems in carpentry that's a much more interesting thing and i think i think that's where you should be focusing your effort to develop your skills in the past i have hired developers even inexperienced developers who didn't have any of the technology that we were working on they hadn't used the operating system they hadn't used the language before because i thought that they looked like they were good developers a good developer can learn to be productive in a new language or a new technology quite quickly they might not be perfect in those technologies but but the basics they'll pick up quickly and so those are the sorts of skills that i would encourage you to focus on invest in these deeper more durable skills languages and frameworks that you use are kind of incidental and when you're starting out you certainly need to build up some skills around some of those things but try not to over focus on them instead look at these more these deeper more profound things that will last for your whole career instead focus on how you solve problems i would argue that solving problems is much more important than the design that we apply i would argue that the design is more important than the coding and i would argue that the coding and the techniques that we apply to that are more important than the languages and the frameworks that we choose and so that's the order in which i would recommend that you concentrate on building your skills and your and developing your talents good test driven development helps focus on several of these things it helps us to keep a focus on the problem that we are solving it also improves the quality of our designs i have a video which uh if you if you check it out i'll put a link up here um check it out and that will describe what i mean by that but it allows us to design better code the hard parts in software development in computer science really there are only two in my opinion concurrency and dependency and dependency management and coupling so i would take those seriously the more experienced people who whose uh advice i take seriously um focus a huge amount of effort on trying to minimize the or manage the coupling and minimize dependencies in the code that they build this is not what most code looks like most code doesn't pay sufficient attention to this but you can tell the difference between developers that focus on this and that don't so worry about those things concurrency the world-class experts in concurrency say that this is so hard that you should try and avoid it if you can the first piece of advice from a world expert on concurrency is don't do concurrency if you can possibly avoid it so try and treat it with a great deal of care at the point at which you need to start thinking about making systems concurrent be suspicious be be be doubtful think if there's a better way of solving that problem rather than using concurrency and at least where you do use concurrency isolate it to the margins of your system these sorts of design ideas are helped by using test driven development because these sorts of things are difficult to write tests for but use this kind of thinking be suspicious of of ideas that lead you in the path of more and more complicated solutions ultimately i i believe that software development is grounded in two fundamental principles which i'll bring to your attention and i think are worth focusing on at all stages of your career but certainly when you're beginning the first is our discipline is an exercise in learning and discovery so optimize to become excellent at learning and discovery for that you need techniques like working iteratively you want to make progress in small steps and and grow the software it almost evolve it to to a nice solution the next is if we're going to work iteratively we need to gather feedback so that we can learn from our iteration understand what it is that we've done and start building up our software and understanding how it is progressing we want to work incrementally we want to compartmentalize our system into separate modules so that we can we can build systems from a series of pieces and and still have a working system and then grow those pieces uh more independently this kind of plays to modularity and separation of concerns and so on all of these things add up to start enabling us to become more experimental in the way that we work and make progress and this is a fantastic attribute of good software developers to be able to try out ideas and play with ideas and understand what works and what doesn't and lastly we need to be empirical we need to be able to to evaluate our our ideas in the real world so how do we understand whether our users uh benefit from our ideas we need to capture data or observe what's going on this if you are uh starting out in your career i would strongly recommend that you do everything that you can to get to see people use the software that you are building by whatever means that you can if you have the opportunity to do that it's a fantastic way of learning and understanding i guarantee you will be surprised by the way in which people use the software that you built it's a great learning experience the next set of important ideas foundational ideas for software engineering in my opinion is that we need to work to manage complexity human beings have a limited capacity there's only so much stuff we can hold in our heads these days we build software systems that ex are beyond that capacity to understand in great detail a modern software system nobody understands everything about what's going on so we need to be able to compartmentalize our system and understand it so that brings in some of those ideas that i mentioned earlier we want to build modular systems and the so that we can separate out and divide up the problem into pieces that are more understandable we want to the flip side of that is we want to take cohesion seriously we want to the stuff that's related we want to be close together one of my favorite descriptions of high quality software design comes from kent beck who said that good design is characterized by moving stuff that's related close together and stuff that's unrelated farther apart and that's a pr it's funny but it's a pretty good description of what good design means and that leads you into ideas like separation of concerns we want each piece of our code to be focused on achieving one thing if you write a piece of code that gets some data from somewhere processes that data and then stores it somewhere that's probably not a great piece of code those are three different concerns you want to be able to retrieve the data process it independently of the way in which you retrieved it and store it independently of the way in which you retrieved it or processed it that would be a better design so think about those sorts of things and that starts leading you to them to think about coupling and the ways in which the pieces are related coupling is it's not simple enough to just say always build loosely couple systems you have to take coupling seriously if we had zero coupling our systems wouldn't be able to talk to each other at all so we need to manage coupling and that gets into one of the really difficult problems as i've described before of dependency management and coupling and those sorts of things but learn about this think about these ideas and lastly in my list of things in terms of managing complexity take abstraction seriously we want to hide information from one part of the system with respect to another i see way too many systems that just expose all of the details everywhere they are tightly coupled poor lines of abstraction poor modularity poor separation and concerns and that makes them almost unmanageable if any of this has been helpful to you please do let me know in the comments i'd be great i'll be very grateful for your feedback on this uh if you're interested in more like this let me know that too uh and maybe maybe consider joining my mail list the details are in the description below thank you very much for watching [Music]
Info
Channel: Continuous Delivery
Views: 62,765
Rating: 4.9746346 out of 5
Keywords: junior developer advice, junior software developers, junior dev, junior software developer salary, junior software developer jobs, new software developers, career advice for software developers, advice for software developers, software developer career advice, software engineering, Dave Farley, Continuous Delivery, DevOps, junior developer
Id: hjIlTaAMsbI
Channel Id: undefined
Length: 27min 46sec (1666 seconds)
Published: Wed Nov 18 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.