我从软件开发的夏天学到的一切

我从软件开发的夏天学到的一切

原文:https://medium.com/hackernoon/a-summer-of-software-development-f4c1696e6ffd

Everyone’s favorite picture for code | https://unsplash.com/@markusspiske

作为加州大学伯克利分校的计算机科学和经济学双学位学生,我一直在努力寻找一份“适合我”的工作或实习机会。

在加州大学第一年毕业后的那个夏天,我在一家早期虚拟现实初创公司实习,开始了我的职业生涯。我最喜欢它。我喜欢考虑潜在用户,设身处地为他们着想,决定如何最好地向他们推销我们的软件和硬件产品。但我鄙视社交媒体上的营销。我不喜欢在脸书、推特、Instagram 上发帖,也不喜欢在红迪网上搞游击营销。

第二年夏天,我在一家人力资源和人事初创公司实习,做兼职业务开发。我的工作是给旧金山和纽约的数百个创业团队发电子邮件,询问他们是否需要帮助雇佣非技术性员工。我绝对喜欢这份工作中的人,但我再次鄙视这份工作本身。

在进一步反思我在伯克利红十字会和联合学生会的实习经历和幻想破灭后,我意识到我错过了关键领域。我没有发挥出我的潜力。

我没有在学术之外的任何领域运用我的经济学或计算机科学知识。反过来,这个事实会让我对学习不感兴趣,或者在课堂上投入大量的精力。如果我从事的工作并没有利用我所学的知识,那我到底为什么要学计算机科学或经济学(更不用说两者了),我为什么要尝试?

我经历过这种想法,尤其是在我的计算机科学课上。我喜欢我所学到的东西,但我并没有试图将这些知识应用到我的课堂项目中。我想我未来的工作不需要它,所以除了最少的努力之外没有任何意义。

在加州大学三年级结束时,我知道我不想与社交媒体、电子邮件或金融有任何瓜葛。我为时已晚(也很沮丧),无法为当时理想的产品管理或咨询实习招聘员工,所以我决定迈出令人不快的一步。我申请并收到了一份在精品工程公司进行低风险、高回报软件开发实习的工作。

太神奇了。在夏天的十几个星期里,我在一个 5 人团队中为一个客户开发了一个初始的、功能齐全的原型 web 应用程序。以下是我学到的:

软件开发比我想象的更有趣

我以前在软件开发方面的经验有两个来源。第一个是我的计算机科学类项目,正如我前面提到的,它并没有吸引我太多的注意力或精力。第二个是为我自己和我的商业伙伴建立静态网站,使用 HTML、CSS 和一些 JavaScript——我真正喜欢的附带项目,但由于我的学术和课外活动,没有找到足够的时间(是的,这是我使用的借口)来工作。

这个暑期实习教会了我如何构建一个成熟的 web 应用程序。这太令人激动了。

我现在心中有了一个目标。有人想用这个应用程序做一些事情,我必须构建这个应用程序,这样他们就可以做一些事情。我必须让他们开心。此外, something 不再为网站提供静态信息。这个东西是动态的。它必须以特定的方式响应特定用户的输入。它必须能够接受过程信息以产生特定的结果。

应用程序包括一个前端(客户端)和一个后端(服务器)。前者是用户看到的和交互的。后者是如何将正确的信息存储在数据库中以及从数据库中访问正确的信息。这些信息在用户交互的某个时候会用到,而我的工作就是从后端获取这些信息,并在适当的时候在前端传递给用户。

框架>>>语言

正如我上面提到的,我参加这个实习时知道 HTML、CSS 和一些 JavaScript。我不需要为了工作去学习一门新的语言。然而,对我来说,参加这次实习的一个很大的障碍是使用这些语言来构建一个完整的 web 应用程序。

根据我在去年 12 月寒假的三周时间里建立兄弟会网站的经验,我知道这个项目会有多困难。这三周是值得的,但我讨厌我不得不将 HTML 从一个文件复制到另一个文件,只是为了在网站的每个页面上呈现完全相同的元素(顶部有一个导航栏,底部有两个页脚)。这使我的代码变得混乱和多余。

然后是这个实习,我对 JavaScript 框架 React 的介绍。突然,每个组件(即导航栏、页脚等。)只需编写一次,并在需要时用<NavigationBar />标签简单引用。我可以用逻辑来决定哪些元素应该呈现(显示在屏幕上),哪些不应该。在任何给定的时刻,我都可以控制每一个元素。

语言>>>框架

我的一个同事实习时是一名后端开发人员。他精通 Python,但对 HTML、CSS 或 JavaScript 知之甚少。因此,当他完成构建应用程序的后端时,他努力过渡到前端。他努力习惯于反应,因为他对 web 结构以及三种基本语言如何一起呈现元素没有基本的理解。他花了几个星期的时间问问题、试错和搜索来适应。

除此之外,我知道我的 HTML 和 CSS 技能很扎实,但是我的 JavaScript 技能还有很大的提升空间。这篇文章也说服了我在这上面投入更多的时间。

在进入更复杂的框架之前,您需要了解基础语言。

开始吧

你不能把所有的时间都花在学习语言和框架(消耗)理论上,而不实际用它们做一些事情(生产)。你必须开始写代码,看看什么可行,什么不可行。当你心中有了想要实现的目标或愿景,当你知道最终产品是什么样的,你就可以用你所拥有的技能和知识推动自己前进。在这个过程中,你会在你的基础上建立并获得自信。

但是在你开始之前,确保每个人都在同一页上

在编写一行代码之前,整个团队应该从头到尾了解应用程序的结构和设计。团队应该了解应用程序的功能,从一种状态到另一种状态的流程,以及应用程序的一致的视觉和结构设计。团队应该知道应用程序必须支持哪些特性——哪些特性构成了最小可行的产品。

简单地说,在整个过程中,每个人都必须保持一致。客户、项目负责人、设计师、工程师和其他以业务为中心的团队都必须进行沟通,以在纸上创建初始原型。

这是我们整个夏天面临的问题之一——设计师落后了,导致工程师(我们)创建了客户不特别喜欢或想要的视觉设计和功能。我们最终达成了共识,但我们浪费了大量资源来构建最终没有成型的东西。

我很高兴我们面对这个问题,因为它教会了我沟通和清晰愿景的重要性。这并不意味着在产品构建过程中不能也不会有改进的变化和迭代,但是了解在开始时达成一致的特性和设计对于确保每个人的时间和精力得到有效利用是至关重要的。

在团队中工作有好处也有坏处

从积极的方面来说,你可以在团队中分享知识,互相评论。有了团队成员,有人很可能有你面临的问题的解决方案,而且总有人会提出想法,以确保你提出最佳解决方案。你可以互相询问他们如何实现一个特性或设计一个元素,或者他们如何构建应用程序的一个组件。团队成员可以分担构建应用程序的工作专注于他们擅长的或者他们想学的东西。团队是一个协作的环境,在这个环境中,每个人都可以互相学习,在最短的时间内开发出最好的应用程序。

另一方面,设计和实现变得更加困难。整个团队必须在整个应用程序的不同点上就存储、访问和利用哪些数据以及如何存储、访问和利用数据达成一致。您必须小心地利用您的团队编写的代码,而不更改任何可能破坏他们代码的内容。解决方案:Git 和版本控制

每个人都必须很好地注释他们的代码,以确保团队理解正在发生的事情和原因。解决方案:即使你是一个人工作,也要这样做,这样任何看你代码的人(甚至是未来的你自己)都能理解。

你不了解应用程序,因为你获得的知识仅限于你直接参与的部分。例如,我的工作主要集中在应用程序的前端。我向你解释我在前端开发的所有东西,前端的其余部分(我没有直接参与)足够好了。我可以告诉你前端是如何访问和利用从后端返回的数据的。然而,我真的无法向你解释数据是如何从后端存储、访问或返回的。它对我来说是模糊的,因为我没有在它上面做太多的工作,所以我不理解应用程序的整个流程。在团队中工作本质上推动你去做你擅长的或者你真正想学的事情。解决方案:真的没有。对你不知道的事情多提意见,如果你是因为某些技能而被某项工作聘用的,这就没什么意义了?独自工作?

要学的东西太多了!

最后的骗局让一切变得更加令人兴奋,但也有点令人伤脑筋。如果我想走全栈开发人员的道路,我需要比现在更多地了解后端甚至前端。

如果我毕业后工作的公司使用的框架与我了解的不同,我也必须自学。所以我们来到了一个岔路口。

我是否专注于在我已经知道的方面做得更好?我申请的工作更适合我,我能更深入地理解和利用我目前的技能吗?

或者,我是否应该专注于更广泛地了解现有的一切—了解前端的 Angular 和 Vue,即使我对 React 很有经验?我申请的工作可以拓展我的前端和后端技能吗?

答案可能是中间的某个地方,但是我如何决定我追求其中一个的程度呢?以及哪些公司在找哪个重点?

这些问题让我对我的软件开发前景感到焦虑,但同时也感到兴奋。我有很大的成长空间,如果我能在 3 个月内学会 React,我相信我能在遇到任何其他事情时做同样的事情。在软件开发中,技能是可以转移的。

在团队中工作的权衡是值得的(在大多数情况下)

如果你正在做一个小规模的项目,在这个项目中,你试图最大化你的个人发展,并从头到尾控制整个实施过程,那就独自去做。

但是如果你正在开发一个大规模的网络应用程序,就像我们这个夏天所做的一样,你需要一个团队。我的导师帕特里克在签约这个项目时知道自己在做什么。他拥有我们在这个项目中使用的语言和框架的知识和经验——他自己建立了整个结构!如果 Patrick 独自完成了这个项目,他就不会像我们其他四个人在这个夏天所做的那样,为了实现一个类似的实现和设计而进行更多的研究。那么他为什么不单独做这个项目呢?

这是不可行的。整个夏天,我们五个人每周至少工作 40 个小时。帕特里克独自工作时每天可以投入 8-14 个小时,如果他真的逼迫自己,可能会更多,但如果他想保持健康和理智,就不会更多。我们作为一个团队在 3 个月内所做的事情,Patrick 一个人至少要花 5 个月才能完成。此外,如果他一个人工作,对他(或我们)来说也不会如此有趣或有意义。在团队中要学习的不仅仅是技术知识,Patrick 真的想把他所知道的教给我们,并在这个过程中学习更多。学到的沟通和激励技巧是无价的,我们五个人在整个夏天建立的友谊是无价的。

软件开发需要大量脑力,很少甚至没有体力

我对实习期望很高。我期望学到我不知道的东西。我希望为应用程序的各种元素提出最好的(或者至少是非常好的)实现。我希望一周工作 5 天,每天工作 8 小时。我希望对自己的工作和进步负责。这些期望得到了满足。

但我没想到,在这 8 个小时中,至少有 7 个小时是坐着看屏幕的,这让我身心俱疲。最初几周,每天结束时,我的眼睛又红又累。如果我进入高潮或者我注意到我的同事在努力工作,很容易忘记每小时起来做伸展运动和放松眼睛。每天我的身体都很僵硬,急需锻炼。

幸运的是,我想到了潜在的解决方案,尽管是在实习结束之后。

纸上的伪代码,在电脑上转录成真正的代码。

如果我知道我需要做什么,我所拥有的数据,以及手头的目标,我就可以在纸上算出所有的逻辑。我可以写出我需要做一件事而不是另一件事的不同情况,我可以准确地写下在哪种情况下应该呈现什么,我可以记下我需要从一个元素传递到另一个元素的数据。我需要在电脑上进行修改和完善设计,但是在纸上花一个小时在电脑上花一个小时总比在电脑上花两个小时好。

这也让我有机会思考可能的边缘情况,并找出在每种情况下该做什么,而不是在我编码时发现这些情况。最后,如果我首先在纸上工作,我会有更干净的代码。

使用计时器,每小时远离工作和电脑放松一下

我 99%确定已经有一个应用程序或 Chrome 扩展了。番茄工作法也很有效。每小时休息一会儿能让我有机会理清思绪,用全新的视角重新审视我的工作,所以这是一个双赢的局面。

买一张立式办公桌

坐着糟透了,立规矩。关于这个就不多说了。但是我会的。

在实习期间,由于举重时的一个不相关的问题,我的背伤得很严重。长时间坐着(8 个多小时)对我的背部没有任何帮助。站着会让它有更多的血液循环。面对现实吧,站着更有趣。

在一个理想的未来,我会在一家附近有健身房的公司工作,在那里我可以在一天的中间,也许是在我的午餐休息时间锻炼,然后回来吃饭和工作同时进行。

它打开了更多的机会

这为更多的机会创造了机会。

这份软件开发实习是我现在兴奋地开始职业生涯的第一步。学习 React 和如果我投入工作,我可以在短短几个月内建立什么给了我自信和对未来的希望。

在我实习和暑假的最后几周,我用 React 重建了我兄弟会的网站,这样我可以简化结构,让未来的编辑和改进对我自己和其他人来说更可行。我正处于使用 Spotify API 的一个附带项目的重要规划阶段,对未来的项目有几个想法。

Patrick 反复宣称“总会有解决方案”每当我或我的同事发现自己陷入了某个功能的设计或实现中。

我同意他的观点,这超出了功能建设的范畴。如果你有构建整个应用程序或软件所需的数据,实际上构建它并不是不可能的。这可能需要几个月的时间,大量的资金,艰苦的工作和毅力,但这是可能的。总有解决的办法

这让我非常开心。

感谢我的导师Patrick Lu(LinkedIn)和同事 Calvin Lee 、Leo Sun 和 Anish Saha 让我度过了一个美妙的夏天,做了我曾经认为我永远不会做或享受的事情。我爱它的每一刻。

Rahul Rangnekar 是加州大学伯克利分校计算机科学和经济学专业的大四学生。他是一个狂热的作家和程序员,希望找到一份将他的技能融入软件开发或产品管理角色的职业。他喜欢举重、阅读和烹饪。 在LinkedIn上找到他。


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除