哪些技能不是学校通常不教授的专业编程必不可少的?[关闭]


14

我是计算机科学专业的一年级学生。我参加了招聘会,分发了简历,令我惊讶的是,我接受了一次面试,最终获得了作为开发人员的实习机会。

我向面试官(将是我的老板)解释说,我只是第一年,没有大量的编程经验。他只是告诉我,因为我在数学方面有很强的背景(我的数学学士学位几乎已经完成,再加上我的一些研究生课程),所以他相信我会做得很好。

我在所有编程课程中都做得不错,但是我仍然觉得自己处于劣势。现在,我真的只是想在开始时做好这项工作。这项工作将主要使用C#,但是除了学习一些C#之外,您希望成为真正的程序员之前还应该学习哪些技能?

任何建议都将不胜感激,但是如果您有任何书籍请告诉。谢谢!


8
这个问题已经在本网站上以不同的方式多次提出。请先搜索,然后再询问。看看常见问题解答;programmers.stackexchange.com/questions/149970/…programmers.stackexchange.com/questions/46716/...
tgkprog

3
我进行了搜索,然后看到了两个问题。但是我不关心学习设计或网站开发。我担心要学习许多程序员认为他们在学校应该真正学到的东西。这些问题确实有一些很好的建议,但是这些并不是我想要的。谢谢
Eric

+1我希望成为一名全职程序员之前可以掌握的一项技能是强大的数学技能,因为数学技能可以说是拥有的最重要技能,因为它训练了解决问题和学习新概念的思想,并且作为一名程序员,是我每天都会做的事。
安东尼

3
工作流程。实现代码并不是独角兽般的雪花。在设计时应用“最小惊讶原则”。事前思考。管理复杂性变得非常重要。
sleeplessnerd

1
实际上,我实际上不喜欢与数学能力强的人一起工作。他们将一切变成数学公式,而不是应用软件工程原理。软件不是数学。编写代码很重要,以便易于理解。
Rob K

Answers:


21

在学校里,您学习编写代码。您不了解的是其余的软件开发。我在学校从未学到的主要知识是:

  • 作为开发团队的一部分
  • 使用版本控制
  • 使用错误跟踪器

对于任何开发人员来说,这些都是非常重要的技能,不幸的是,您不太可能将它们带到教室。


4
当然,作为开发团队的一部分工作是一件微妙而复杂的艺术。我不明白为什么版本控制和错误跟踪始终被视为新开发人员的主要障碍。它们当然是重要的工具,但是您可以将新手指向手册页,O'Reilly的书或在线教程,他们可以在数小时内掌握面包和黄油的使用情况。你为什么要在这样的事情上浪费课堂时间?
Charles E. Grant

1
@ CharlesE.Grant版本控制与编程类似,因为您可以在较短的时间内掌握基础知识,但是要有效地使用它,需要经验。像git和Mercurial这样的DVCS比像svn这样的CVCS需要更多的了解。
Izkata

8
我从来没有上过维护已有代码的课程(这是开发团队工作的重要组成部分),而我在课堂上关于如何测试代码的经验很少。
Velociraptors 2013年

1
@ CharlesE.Grant:我已经教授了几年编程和相关主题的研究生课程。即使是研究生,也很难理解为什么要使用任何形式的修订控制系统。当他们勉强地开始使用它时,他们似乎很快就对它感到困惑。+1向梅森(Mason)提出将其提升为一个重要的未学主题。
Peter K.

1
+1 +1 +1,每个点一个。太愚蠢了,他们没有教你这些东西……或者至少是TRY教你。
Radu Murzea

20

我希望我在职业生涯的早期就知道,作为一名开发人员,我在业务中扮演着非常重要的角色。我不只是代码猴子。

作为开发人员,您会在与您正在使用的软件相关的业务领域发挥主要作用。

如果您的公司没有为其代码编写测试,请立即开始编写测试。

如果他们不跟踪错误,请立即找到合适的错误跟踪器。

如果您的老板希望您立即开始为电子表格应用程序的启动屏幕制作精美的动画-但在下一个客户发布截止日期之前,您仍然有数十个错误需要修复,并且还有一些关键未完成的功能-进行有关正确确定工作优先级的对话。

即使您只是“一名普通员工”,像顾问一样行事也是让自己与其他开发人员区别开的好方法,这些开发人员只是编写代码,而不会像对业务有既得利益那样行事。


9

我的学校从来没有教我如何解决问题。他们教会了我编码的技巧,但是能够学习,理解问题并提出解决方案是他们没有教过的。除了了解编程语言外,它还需要耐心,严谨和直觉。

他们也没有讲授团队合作,版本控制以及编写易于维护的代码的重要性。他们也没有太多关于如何测试软件的知识。他们可能接触过单元测试,但是并没有过多地研究验收测试,回归测试等概念。

免责声明:我在80年代上大学。但是,我从今天雇用的人们那里看到了这一点的证据-应届毕业生,他们对编程的实际世界知之甚少:版本控制,测试,简洁的编码,调试技能等。


+1为测试部分。在我的大学,他们也不教。我上了一堂课(是:一堂),老师提到了单元测试……大约3分钟。而已。
Radu Murzea 2013年

我知道这是一个较晚的答复,但这是使我的数学学位吸引我的雇主的原因之一。雇主肯定也同意这种观点。
埃里克

同意在许多学校中,算法(也称为“问题解决”)没有被正确地讲授,或者根本没有被讲授,或者即使必须被称为“不可知论”,也没有教导如何将其与编程语言一起使用。
umlcat

嗯....您的回答与我所经历的完全相反。学校的重点是提供背景知识,以便您可以有效地研究,理解问题并提出解决方案。一个刚毕业的应届毕业生也许不是“擅长”,但是他们当然应该经过培训并且有能力。在我学校,他们根本不教编程。您应该在学习本课程试图教给您的信息的同时,学习如何(自己)编程。因此,您从那里得到的只是他们所教不到的“编码力学” ...
Dunk

...在体面的学校中,您不会仅仅因为学习如何编码而获得荣誉。如果您发现使用版本控制具有挑战性,那么您将面临更严重的问题,而没有足够的学历帮助。当您想出一种易于维护的确定性代码编写方法时,请写一本书,然后变得富有。还没有人解决这个问题。您一定错过了学校必须上交的程序才能进行测试的部分。验收/回归测试是针对特定行业的,因此最好以公司的方式而不是在学校的方式来做。
Dunk 2015年

7

我认为一些在学校中没有学到(或正确学习)的最重要的事情是:

  • 如何正确使用和IDE;使用现代IDE的全部功能可大大提高生产力:自动重构,代码导航,VCS集成,代码分析,代码完成等。
  • 如何正确使用调试器:远程调试,多线程应用程序调试,快速评估等。
  • 错误修复和维护;在大学里,他们几乎没有教给您任何有关此的知识,但是在行业中,修复错误的情况很普遍。
  • 如何在大型团队和大型项目中工作;基本上在大学中,与大型工业项目相比,这些项目是小型的。
  • 如何编写好的代码以及如何强调可读性;这是有经验的,但是有些书可以教您一些基础知识(代码完成,清洁代码等)。
  • 如何通过自定义充分利用框架;在大学里,也许您已经学会了如何在一些非常基本的场景中使用一些框架;在行业中,您将遇到困境。
  • 规范后如何理解和编写代码;您可能会学习如何编写规范,但是现在如何阅读规范以及如何解释规范

VCS,错误跟踪系统,构建工具等是您必须学习才能与团队合作的工具;他们不需要太多的时间来学习基础知识,并且在那之后(至少在开始时)非常简单;上面的列表包含一些细微之处,这些细微之处如果已知的话,可以提高您的生产率。


又名“编程”不只是知道一种编程语言,还有一个“环境”,“生态系统”,“框架”……
umlcat

4

我认为应届毕业生最缺少的是对版本控制的充分理解。

如果您有使用源代码存储库(例如GitHub)进行开源软件开发的经验,那么most您将比同班同学领先一步。

第二件事是对复杂度big O)的理解。大多数大学外的人都听说过它,但是还没有开发出真正的软件来发挥作用,因此不了解它的真正重要性。

当您的数据集如此之大,以至于蛮力永远不会被砍掉,并且对其他技术的了解很有用,并且能够猜测什么时候蛮力对这种情况适用,这是您在积累经验和犯错误的基础上开发的。


1
我认为缺乏版本控制教育的情况正在开始改变。我的学校非常重视版本控制。
Southpaw Hare

@SouthpawHare:我并不是说它不存在,他们甚至在我的时代就已经教过它。仅有这些经验的大学毕业生仍然是少数。这样的人更有价值。我不同意在过去20年中它发生了很大变化。
马丁·约克

3

如何进行良好的调试,尤其是使用调试器并采取正确的方法来解决错误,即找出导致问题的原因,找出导致问题的原因并了解解决方案的解决方法,而不仅仅是尝试尝试。

大多数计算机科学专业的毕业生在调试方面都非常差劲,因此,修复所需的时间远远超出了所需的时间,并且在这样做时会产生更多的错误。

其他诸如版本控制,错误跟踪之类的事情值得一提,但在我看来,缺乏明智的调试方法是一个更大的问题,需要更多的学习。


2

在成为一名真正的程序员之前,您希望学到的一项技能是什么?

根据我的经验,我的学校从未教过我如何解决问题。

以我的经验,编程就是解决问题。在我学校,他们只是检查您是否可以编写没有语法错误的程序。实际所需的内容未作为输入给出。语法只是您可以根据需要从任何书籍中查找的内容。但是,解决问题的能力无法在任何地方获得,除非您能很好地练习和训练自己。

不管它是什么类型,请尝试完成尽可能多的问题,以便您对自己有一定的信心。试着在您的心中充满激情地完成它,您一定会成功的。


2

花一些时间来学习一些常见的设计模式:工厂,单例,适配器,命令和观察者(我的大学没有教过它们)。

如果公司使用敏捷方法论进行软件开发,那么对它有所了解将是有价值的。


2

在大学/学术环境中,几乎每个人都不具备作为专业程序员所需要的许多技能。

他们只能来自直接在现场工作的经验。

  • 学习如何与“专业”之外的人进行协作和沟通,例如图形设计师,产品设计师,经理等。

  • 了解您的工作不是编写代码,而是使产品栩栩如生。说起来容易做起来难。

  • 知道如何在良好的编码习惯与实际考虑之间取得平衡。获得判断代码何时“足够好”,“过度设计”或“需要重构”的能力。

  • 学习克服自己的弱点和不安全感。获得抵制批评的能力。放开你的自我。了解承担个人责任,然后承担责任的含义。

这很容易阅读。实际上将其付诸实践是完全不同的事情。唯一的方法就是这样做。您会被咬很多次,并且可能会受伤,但是您会变得更强大,更好。

相关阅读:学徒模式


1

这一切都取决于学校。在我的大学里,我们有很多实际的项目。在团队中经常使用各种源代码控制。所以我认为有些学校确实专注于这些。

但是学校不教的一件事:细节。当学校教一些技术或实践(例如Web开发,JAVA UI开发,高级数据库)时,他们常常只是从头开始,从不深入细节,这对于在现实世界中使用该技术或实践是必不可少的。您将获得有关解决问题的可能方法的一般概述,但是您将需要学习必要的细节。

只有在学校将某些东西教给细节时,才是东西背后具有强大的数学或理论背景。诸如形式语言或SQL数据库之类的东西通常是学校课程的核心部分,因为它们是建立在数学基础上的,并且在计算机科学或工程学中被大量使用。


1
  • 要求-弄错了,休息通常是浪费
  • 优先级(哪个版本具有哪些功能)
  • 开箱即用或使用(购买/免费软件)
  • 团队合作
  • 项目管理-要求,质量(产品中的数据样本,测试用例,如何测试,编码之前的覆盖范围,还有更多类似成本的问题,但不相关。请阅读PMI书
  • 沟通工具(邮件,会议:日历计划者)
  • 源代码管理

0

我希望我能早早决定要成为一名整体程序员,学习许多不同的事物,语言,数据库和平台,并最终成为一名Web开发人员,还是只专注于一个CMS,甚至只是专精于Photoshop,是一名专家,您的技能也将变得有价值和有益,然后才真正知道真正的程序员应该知道什么。换句话说,如果您只需要赚大钱,那就专门研究一件事。如果您喜欢计算机并且喜欢解决问题,请成为程序员。

[回顾和学习4或5种不同的javascript'frameworks'之后,JQuery才真正变得强大起来,获得了JAVA认证并且从未获得Java职位,并且在多个平台上工作之后;AS400- rpg,>。NET-c#和PHP,然后才希望我精通Photoshop并赚到同等的钱,而无需修复错误或编写软件。]

我的意思是,了解广泛的主题会带来一定的满足感,但是当您看到只知道photoshop可以兑现相同薪水的人时,这种满足感就会变得步履蹒跚。


2
是的,但是那种专家永远不会开设自己的商店。如果您的梦想是将来某个时候成为自己的创业公司的首席执行官,那么您将需要大量的技能。
2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.