I consider myself to be in a fortunate position at this point in my life. I recently moved out into a house with my girlfriend, I adopted three wonderful kitties, and more all during this pandemic. I was also very fortunate to keep my job as a junior software developer.

我认为自己在这一生中处于有利地位。 最近,我和女友搬进了一所房子,收养了三只奇妙的小猫,在这场大流行中更多。 我也很幸运能继续担任初级软件开发人员的工作。

I started working as a junior developer around late August of 2019, right at the start of my junior year of college. We are a small, but growing managed service provider. Before then, I was (and still am) working on a freelancing project that kick started my passion for building software that school never could.

我在大学三年级刚开始时,大约在2019年8月下旬开始担任初级开发人员的工作。 我们是一家规模虽小但正在成长的托管服务提供商。 在那之前,我(现在还在)正在从事一项自由职业项目,这激发了我对构建学校从未有过的软件的热情。

In starting my freelance project, I began to see that there were a lot of pieces to being in this field that school just doesn’t teach. Some of these things were reinforced when I started working and other new ones popped up. Some of the things I learned relate to technology and others not so much. Either way, the role of developer is now constantly changing and growing. Developers now do back-end and front-end, database administration, deployments, and more.

在开始我的自由职业者项目时,我开始发现,在这个领域中有很多东西是学校根本不教的。 当我开始工作时,其中一些事情得到了加强,而其他新事物又弹出了。 我学到的一些东西与技术有关,而其他东西则很少。 无论哪种方式,开发人员的角色现在都在不断变化和增长。 开发人员现在可以进行后端和前端,数据库管理,部署等等。

Now, as I enter my senior year of school, I would like to take a step back and reflect on what I learned from being in the field that school never did teach me. Here are the top five things that school did not teach me.

现在,当我进入高中时,我想退后一步,回顾一下我从该领域中学到的知识,即学校从未教过我。 这是学校没有教我的最重要的五件事。

(1. Language doesn’t matter, at least in the way you think)

My programming journey began in 2015 with Java and continued into 2016 with C#. After graduating high school, I entered college where I took C++ and Advanced Java. My next semester I took a formal C# course, along with HTML and CSS. I eventually took an Assembly Language and a Javascript class as well.

我的编程之旅始于2015年使用Java的过程,一直持续到2016年使用C#。 高中毕业后,我进入大学学习了C ++和Advanced Java。 下个学期,我学习了HTML和CSS以及C#的正式课程。 我最终也学习了汇编语言和Javascript类。

I remember sitting in these classes thinking “Wow this language is so great I’m going to use it for everything”. And unfortunately this is not how the real world works. Worse off is the teachers made each language seem like the definitive, best way to write software. My C++ teacher would rag on Java, and my Java teacher would rag on C++. It lead to a lot of confusion in what I should focus on.

我记得坐在这些班级时曾想过:“哇,这门语言太棒了,我将在所有方面使用它”。 不幸的是,这不是现实世界的工作方式。 更糟糕的是,教师使每种语言看起来像是确定的,最佳的软件编写方式。 我的C ++老师会使用Java,而Java老师会使用C ++。 这引起了我应该关注的重点的混乱。

Then once I started working and freelancing, it hit me. It doesn’t matter, or at least as much as you might think. The thing is, each language, framework, library, all has their place in the world of software. Want to quickly build and prototype a new application? There’s Python, Ruby, and NodeJS. Need a type safe, compute intensive application? Have a crack at Java, C#, or Go. Have to work at a hardware level where performance is a concern? Well try out C++ or Rust. Each one of these languages is the right tool for some kind of job.

然后,一旦我开始工作和自由职业,它就打击了我。 没关系,或者至少与您想像的一样。 关键是,每种语言,框架,库在软件领域中都有各自的位置。 是否想快速构建新应用程序并制作原型? 有Python,Ruby和NodeJS。 需要类型安全,计算密集型应用程序吗? 精通Java,C#或Go。 是否必须在关注性能的硬件级别上工作? 好吧,尝试一下C ++或Rust。 这些语言中的每一种都是执行某种工作的正确工具。

When I started my freelance project, I had to sit down and look at what was needed. I had to think about scalability, time to develop, features they wanted in version 1.0 and wanted to add later on. I eventually settled on a Java Spring API connected to a PostgreSQL database. For the front end I settled initially on Angular, but I hit some limitations in it, so I moved over to React. The choices here were simple; all the technology is open source, PostgreSQL has a ton of features for me to take advantage of, Java and Spring let us build a rigid but scalable API that can do some serious processing very quickly, and React let us create a responsive UI that we can then turn and do things like Server Side Rendering and create a Progressive Web App with very easily. At work, we use .NET tools and libraries because it quickly allows us to build the products our clients need. What makes it easier is that most of them are on Azure and Azure SQL Server, so we can deploy their applications very easily as well as have a database that integrates seamlessly into our stack.

当我开始自由职业项目时,我不得不坐下来看看需要什么。 我必须考虑可伸缩性,开发时间,他们在1.0版中想要并在以后添加的功能。 我最终决定使用连接到PostgreSQL数据库的Java Spring API。 对于前端,我最初选择了Angular,但是遇到了一些限制,因此我转到了React。 这里的选择很简单。 所有技术都是开源的,PostgreSQL有很多功能可供我利用,Java和Spring让我们构建了一个可扩展的刚性API,可以非常快速地进行一些认真的处理,而React让我们创建了一个响应式UI,然后可以轻松地执行诸如服务器端渲染之类的事情,并轻松创建Progressive Web App。 在工作中,我们使用.NET工具和库,因为它可以使我们快速构建客户所需的产品。 更容易的是,它们中的大多数都位于Azure和Azure SQL Server上,因此我们可以非常轻松地部署它们的应用程序,并拥有一个无缝集成到我们堆栈中的数据库。

Lesson learned: No language is one-size-fits-all, each has their own strengths and weaknesses that make some better than others for specific tasks.

获得的经验:没有一种语言能千篇一律,每种语言都有自己的长处和短处,它们在某些特定任务上比其他语言要好。

(2. Git (or any version control))

Git is one of those things that I had to learn myself. It took me a lot longer than I would like to admit and I am by no means an expert in it, but Git is one of those things that would have been great to have learned as apart of some programming class. Instead, we had to zip up and submit our files that way. It’s not a bad way to manage applications in that setting, but really doesn’t teach you how or why version control is so important.

Git是我必须学习的东西之一。 我花了很多时间比我想承认的要长得多,而且我绝不是专家,但是Git是其中的一门,对某些编程课来说,这是一件很棒的事情。 相反,我们不得不以这种方式压缩并提交文件。 在那种情况下管理应用程序不是一个坏方法,但实际上并没有告诉您版本控制的重要性。

Version control is essential to modern software development. From small to large projects, it’s crucial to writing and maintaining code. In my own daily workflow, I create a project and push all the initial files to the master branch. Then I create a develop branch that contains all the initial files from master. When I go to create a feature, I create a new branch with that feature name. After I complete it, I merge it back with develop for testing to make sure it works with the any other features that were worked on. Then I merge with master and push to production. Here then I use tags to denote the version being pushed up. If a version starts failing, I can easily roll back to a version I know works.

版本控制对于现代软件开发至关重要。 从小型项目到大型项目,编写和维护代码都是至关重要的。 在我自己的日常工作流程中,我创建一个项目并将所有初始文件推送到master分支。 然后,我创建一个develop分支,其中包含master的所有初始文件。 当我创建功能时,会使用该功能名称创建一个新分支。 完成之后,我将其与开发进行合并以进行测试,以确保它可以与其他已使用的功能一起使用。 然后,我与主人合并并开始生产。 然后在这里,我使用标签来表示要推送的版本。 如果某个版本开始出现故障,我可以轻松地回滚到我知道可以使用的版本。

Version control is really a skill that should be taught in school. As developers are taking on more and more rolls in the workplace, knowing this part of the software development life cycle is crucial to success in the workplace. It’s also crucial to helping developers get jobs. Putting your projects on a platform like GitHub is how potential employers can go and look at what you’ve done, like a portfolio for your software.

版本控制实际上是一项应该在学校教授的技能。 随着开发人员在工作场所中扮演越来越多的角色,了解软件开发生命周期的这一部分对于在工作场所取得成功至关重要。 这对帮助开发人员获得工作也至关重要。 将您的项目放在GitHub之类的平台上,是潜在雇主可以如何查看您所做的事情,例如软件组合。

Lesson Learned: Git and version control is an extremely important tool for developing software and for building your development portfolio.

经验教训:Git和版本控制是用于开发软件和构建开发产品组合的极其重要的工具。

(3. Client Relations)

This one is a little less technical, but still extremely important to the life of a developer. In my schooling, client relationships were brought up in my Systems Design class, but only for discussing planning and for taking the plans and turning them into technical documents such as Entity Relationship Diagrams. It was more on the process and less on the client.

这一点技术性较低,但对于开发人员的生命仍然非常重要。 在我的学校里,客户关系是在我的系统设计课程中建立的,但仅用于讨论计划,制定计划并将其转变为技术文档,例如实体关系图。 它更多地在流程上,而在客户上则更少。

One of the first things I realized when I started building software for others is that everybody is completely different in their levels of understanding technology. Some people have a grasp on it and understand your technical specifications and can ask questions, others think you sit at your desk all day with a magic wand and pull things out of the air with the flick of the wrist without realizing how much time or process goes into actually building something.

当我开始为他人构建软件时,我意识到的第一件事是,每个人对技术的理解水平完全不同。 有些人对此有所了解,并了解您的技术规格并可以提出问题,另一些人则认为您整日坐在魔杖旁,只需轻轻一挥手腕就可以将物品从空中拔出,而没有意识到需要多少时间或过程实际建造东西。

It’s important to know this when dealing with anyone outside of software development. Sometimes you can geek out and discuss specifications in detail and other times you have to manage exceptions without talking about the tech parts at all. Sometimes you deal with bugs or issues for days and only have it come back as a user error. Things like that happen and that’s okay.

与软件开发之外的任何人打交道时,务必要了解这一点。 有时,您可以浏览和详细讨论规范,而有时您必须管理异常而根本不谈论技术部分。 有时您要处理几天的错误或问题,而只是将其作为用户错误返回。 这样的事情发生了,没关系。

Some things that are important to remember are being open and realistic with the client, no matter if you’re in the planning, testing, or bug fixing stages of development. Don’t be afraid to speak up if you have an idea that you think may work better than what is being proposed, but be respectful about it. Understand who you are talking with and their level of technical insight. Having a healthy client relationship is key to making great software.

无论您处于开发的计划,测试还是错误修复阶段,与客户保持开放和现实都是要记住的一些重要事情。 如果您有一个想法认为自己的工作效果可能比提出的建议更好,请不要害怕大声疾呼,但请尊重。 了解您正在与谁交谈以及他们的技术见识水平。 建立良好的客户关系是制作出色软件的关键。

Lesson Learned: Managing and maintaining healthy relationships with clients is just as important as writing good code.

经验教训:管理和维护与客户的健康关系与编写良好的代码一样重要。

(4. Deploying Software)

Maybe this one is a little unfair, but seeing as how developers are having to take more rolls on and learn more skills, I think this is an important topic to touch on. This is more important than ever now with the advent and embrace of cloud computing. Developers are now needing to know how to deploy applications to the cloud, whether that be on AWS or Azure or Google Cloud Platform, this is skill is very important.

也许这有点不公平,但是鉴于开发人员必须付出更多努力并学习更多技能,我认为这是一个很重要的话题。 随着云计算的出现和普及,这比现在更加重要。 开发人员现在需要知道如何将应用程序部署到云(无论是在AWS还是Azure或Google Cloud Platform上),这项技能非常重要。

You just built a shiny new app and you’re ready to share it with the world. Now what? What do you go with it? You go online and lookup how to host a website. You now realize you need a domain, a cloud provider to host it on, setup Nginx or Apache to serve your pages, configure firewall rules and holy cow you’re going to explode. Now today, tools like Netlify and GitHub Pages make this so, so much easier to do so static sites, but what about sites that aren’t static?

您刚刚构建了一个闪亮的新应用,并准备与世界分享。 怎么办? 你怎么办呢? 您上网查看了如何托管网站。 现在,您意识到需要一个域,一个云提供商来托管它,设置Nginx或Apache来服务您的页面,配置防火墙规则以及您将要爆炸的圣牛。 如今,使用Netlify和GitHub Pages之类的工具可以使静态站点变得如此容易,但是非静态站点又如何呢?

I’m not saying cloud computing should be taught in school because there are so many providers with services and features. But I think, at least in Linux or Linux Administration classes, things like Nginx/Apache, where static files go, how to configure firewall rules, and all that should be taught. My introduction to Linux class focused a lot basic commands and RegEx. All of that is very important in doing work in Linux, but things like command line messenger systems really do not seem as important as knowing how to configure Nginx.

我并不是说应该在学校里教授云计算,因为有这么多提供服务和功能的提供商。 但是我认为,至少在Linux或Linux Administration类中,诸如Nginx / Apache之类的东西,静态文件存放在哪里,如何配置防火墙规则以及所有这些都应该教。 我对Linux类的介绍集中了很多基本命令和RegEx。 所有这些对于在Linux中进行工作都是非常重要的,但是诸如命令行Messenger系统之类的事情实际上并不像了解如何配置Nginx那样重要。

Lesson Learned: Again, maybe this section was unfair, but I think it’s important to know how to deploy your software, or at the very least, some different options for deployment and configuration.

经验教训:再次,也许这部分是不公平的,但是我认为了解如何部署软件,或者至少是一些不同的部署和配置选项很重要。

(5. How to write software)

This may seem kinda stupid, but all throughout my schooling, I never learned how to actually write a piece of software. What I learned in school was syntax and theory, but not how to actually write software. In my five, almost six years of studying computer science, I have about 1.5 projects I would consider to be pieces of usable software.

这似乎有点愚蠢,但是在我整个学习过程中,我从未学会如何实际编写软件。 我在学校中学到的是语法和理论,而不是如何实际编写软件。 在我学习计算机科学的五年(将近六年)中,我大约有1.5个项目将被视为有用的软件。

The 0.5 one was a bank account management app in C++, except all the values in it were hard coded. There was not dynamic input and output and the logic flow was very clunky. You had to have it do specific things on specific dates, which again were events that had to be hard coded. The only full project I did was a Java FX text editor that could read files and be edited and then saved back out. It was completely standalone and had no database or configurations or syntax highlighting or anything fancy, but it made me feel good that I made it.

0.5是C ++中的银行帐户管理应用程序,除了其中的所有值都是硬编码的。 没有动态输入和输出,逻辑流程非常笨拙。 您必须让它在特定的日期做特定的事情,这又是必须硬编码的事件。 我做的唯一的完整项目是Java FX文本编辑器,它可以读取文件并进行编辑,然后保存回来。 它是完全独立的,没有数据库,配置,语法突出显示或任何花哨的内容,但是让我感到非常满意。

All the other projects we did were either completed with some fill in the blanks or just theoretical “this is how a for loop works under the hood” kind of examples. It wasn’t until I started freelancing that I began to understand how software all fits together. I learned about database connections, REST API’s, security practices, JWT tokens, and much, much more. I look at it like school taught me how to code and the real world taught me how to write software. Knowing how to write a LinkedList is very different from knowing where and how to use a LinkedList.

我们所做的所有其他项目都以一定的空白填补,或者只是理论上的“这就是for循环在幕后的工作方式”之类的例子。 直到我开始自由职业时,我才开始理解软件如何组合在一起。 我了解了数据库连接,REST API,安全性实践,JWT令牌等等。 我看着它就像学校教我如何编码,而现实世界教我如何编写软件。 知道如何编写LinkedList与知道在哪里以及如何使用LinkedList有很大的不同。

Lesson Learned: Knowing how to write code is not the same thing as knowing how to write software.

获得的经验:知道如何编写代码与知道如何编写软件不是一回事。

I know I keep saying it, but developers are taking on more and more roles and this is creating a divide in what schools teach and what people do in their daily lives. We need to know how to architect applications, deploy them, and version them. We need to know multiple languages and where they are useful. We need to know how to communicate with clients and how make what they want a reality.

我知道我一直在说这句话,但是开发人员正在扮演越来越多的角色,这在学校教的内容和人们的日常生活中造成了分歧。 我们需要知道如何构建应用程序,对其进行部署以及对其进行版本控制。 我们需要知道多种语言以及它们在什么地方有用。 我们需要知道如何与客户沟通以及如何使他们想要的东西成为现实。

Maybe I was unfair to our computer science curriculum in some areas and really, I did not mean to be. These were just some of the things that I had to learn myself when I started doing this in the real world. Things like Git were never mentioned in any of my classes, I thought I had to commit to learning one language and stick to it forever, I had no idea Cloud Computing or Apache or Nginx existed, let alone how to use them. These things are all really important in today’s world. It’s where things like bootcamps have really started to pickup in popularity, along with online courses on Udemy and Pluralsight. Those camps and platforms give you resources to learn how to do everything I had discussed before. It was how I learned to do these things.

也许我在某些领域对我们的计算机科学课程不公平,实际上,我并非故意如此。 这些只是我在现实世界中开始学习时必须学习的一些东西。 像Git这样的事情在我的所有课程中都从未提到过,我以为我必须致力于学习一种语言并永远坚持下去,我不知道云计算,Apache或Nginx的存在,更不用说如何使用它们了。 这些东西在当今世界都非常重要。 在这里,像训练营之类的东西以及有关Udemy和Pluralsight的在线课程开始真正开始流行。 这些训练营和平台为您提供了学习我以前讨论过的所有方法的资源。 这就是我学会做这些事情的方式。

Do curriculum's need to be looked at? Most likely. Colleges do have their value in computer science programs. For instance, it lays a good foundation in languages, shows you how and why things work how they do, and gives you access to things like clubs. But I do believe what they teach needs to grow and change to better prepare graduates for actually working in the industry.

是否需要考虑课程设置? 最有可能的。 大学在计算机科学程序中确实具有其价值。 例如,它为语言打下了良好的基础,向您展示了事物如何以及为什么起作用,并且使您可以访问诸如俱乐部之类的事物。 但我确实相信,他们所教的内容需要不断发展和变化,以更好地为毕业生做好实际在该行业工作的准备。