假设您已经编程超过10年了。您知道许多语言,但很少有非常详细的语言。您一直在设计解决方案的体系结构,从事并交付了较大的项目。您一直在研究模式,最佳实践,有效的编码准则,单元测试,多线程等。
然后,您逐渐感到一种感觉,即您阅读的大多数书籍每100页文字提供的信息越来越少。因此,他们开始提供递减的回报。您仍在学习,但不再进步。
与以前相比,为什么学习的生产力下降?
那时,它曾经改变您的思维方式,教给您新事物,拓宽了视野,后来改善了您当前的职业,或者允许发明/管理/建造新事物。为什么不再是这种情况?
假设您已经编程超过10年了。您知道许多语言,但很少有非常详细的语言。您一直在设计解决方案的体系结构,从事并交付了较大的项目。您一直在研究模式,最佳实践,有效的编码准则,单元测试,多线程等。
然后,您逐渐感到一种感觉,即您阅读的大多数书籍每100页文字提供的信息越来越少。因此,他们开始提供递减的回报。您仍在学习,但不再进步。
与以前相比,为什么学习的生产力下降?
那时,它曾经改变您的思维方式,教给您新事物,拓宽了视野,后来改善了您当前的职业,或者允许发明/管理/建造新事物。为什么不再是这种情况?
Answers:
首先,尽管提出了问题的方式,但任何学习都没有止境,尤其是在我们领域,因为新事物的产生比您阅读有关它们的速度快。就是说,当您要改进时,我将考虑以下类别。为了获得最大的利益/投资回报,您应该从最薄弱的领域中选择一些东西。
尽管知道编程语言并具有实践经验,但人们经常(尤其是自学)在其中一些基本的基础知识还不完善的领域。考虑一下诸如数据结构,算法,缓存策略,哈希函数等...
请注意,这还包括编程语言的基础-从编译器,优化技术和类型系统到类别理论,单子语法等等。
如果您受过良好的教育,例如已经获得了大学学位,那么您在这一类别中可能已经很强(当然还远远不够,但基础很强)。否则,请尝试阅读这些区域中的几本书,以查明您的曲目中是否有您根本不知道的东西。此类别是最容易高估自己的类别。
当程序员出现时以为他们是万能的,而对主流范式却一无所知时,我总是感到惊讶。如果您认为面向对象是终结,那么这就是您需要改进的类别。如果您认为函数式编程也存在,甚至可能听说过逻辑编程,那么它仍然是一个不错的选择。还有更多的范式,对它们的了解对您产生类似于编程世界新视野的深刻影响。
只是不要忘记:关于什么可以被视为范式的论点经常(本质上是哲学)。不要被这些所困扰。您的目标应该是拓宽视野,这意味着了解这些东西,无论是否有人将X视为自己的范例,都不会对此产生任何影响。
所有这些中最简单的-同时最不有用。当然,您可以致力于一种技术并了解其所有来龙去脉,但是您应该准备为此付出代价。随着技术的日新月异,它们的发展速度越来越快,这几乎可以保证,在这里投入的时间将在未来几年毫无价值。
收益递减的问题也在这里闪耀。从本质上讲,成为某事的专家意味着您必须在狭窄的主题上花费无数的时间,因此,根据定义,学习新知识将花费您很长的时间,而新事物将是一个很小的小难题,不会改变任何人对任何事物的看法。
是因为这是您的工作领域,还是仅基于您的个人兴趣,但是成为计算机科学和某个领域的专家是非常有价值和有益的。我在这里不是在谈论CS的其他领域,例如计算机图形学或AI。相反,请注意计算机已经占据了每个人的生活,这使得其他每个领域都受到计算机和您可以进入的领域的约束。
这显然属于“您的领域之外”类别,但它不是一个尖锐的数学“外部”,而是一个应用领域。考虑药物:我不建议您成为医生。但是,学习医学基础以将您现有的计算机科学知识应用于该领域的问题确实值得。范围从可视化技术到机器人技术,再到专家系统和仅用于会计/管理的数据管理。尽管您已经完成了所有这些操作,但是在另一个领域中进行操作最终可能会带来全新的体验。
不过请记住,与其他类别相比,这是您方向发生更大变化的一种方式。您在日常工作中可能没有与该领域的任何联系,因此很难实现。它甚至可能意味着切换工作。另外,您将需要有关新领域的某种认证-毕竟您是该领域的完全新手,并且您必须与跨学科研究的毕业生竞争,这些学科已经开始了他们成为该领域专家的旅程。
正如Mike Brown所补充的,在您当前的工作中还存在一些知识领域,但是并不是绝对必要的。您不需要成为项目经理就可以了解项目管理,但是像往常一样,更多的知识将使您对另一端的变化有更深入的了解。甚至可以将这一点推广到专注于软技能的地步。我猜每个与其他人一起从事真实项目的人都知道这些价值。
我认为软件一直在发展,因此强调不断改进。我知道您来自哪里,最近感觉有点相似,现在我正在SQL Server中追求MCSM。
学习下一种新的语言或框架,或当前“热门”的东西。每年都有一种技术,框架或语言问世,或者达到极限,使其本身成为一个时髦的词。在过去的几年中,我可以想到其中的一些:node.js,Ruby,jQuery。这也可能会影响您对其他平台的思考方式,例如,了解ROR对使用Grails的Java的影响。
总有改进的余地。我认为您不可能在所有方面都成为专家,而且我读了很多书,而且我一直在学习。我确实同意您所说的关于每100页学习越来越少的说法,但是当您是主题专家时,这是可以预期的。
关于您可以做什么,这里有一些建议:
与社区变化以及人们正在“进入”的事物保持同步。至少要学习新的堆栈,以便您有足够的建议来推荐它们
参与这样的问答网站,在这里您可以将自己的知识传授给他人。如果您花时间阅读其他人的贡献,您可能会学到一些东西,至少您可能会看到其他人的观点。
选择与您的工作有关的爱好。有很多兴趣爱好,包括交叉思考,人工智能,乐高头脑风暴,RaspPi等。
在尝试增加知识的广度的同时,请注意增加深度。例如,了解EF在幕后的工作方式,因此您可以诊断那些怪异的极端情况,而不仅仅是使用框架。
追求顶级认证只是为了证明您了解您的知识
就我个人而言,我会告诉你目前有什么想法。我正在阅读每个软件架构师应该知道的97件事,尽管我只是部分了解它,但它却提出了许多明智的建议。该书可通过我提供的链接免费在线阅读。
就我最终从事的爱好而言,我进入了车辆诊断程序(显然是通过计算机),这使我得以完全维护自己的汽车。我真的很享受与我一起工作的时间。
在确定了某点之后,您已经对某个特定主题学到了足够的知识,可以随时随地学习新知识。当您觉得没有太多要学习的基础知识时,该开始获取补充知识以补充您的基础知识的时候了。
对我而言,我将深入研究UX和图形设计,因为我认为这将使我作为开发人员更好地提供不仅优美的代码结构,而且还为最终用户提供优美的界面。
您可以采用的其他主题包括项目管理,业务分析,系统管理和软件过程改进。如果您发现自己在特定的领域工作,那么更深入地研究该领域可能是有意义的。例如,最近我一直在金融服务业中投入大量精力。我已经注册了Coursera上有关财务建模的课程,并且类似课程将帮助我与客户交流。
总会有更多的东西要学习,这需要跳出框框思考。
这个问题有两个部分:为什么学习起来更困难,又能做什么?
第一部分非常简单-较高级的主题更难。学习如何编程虽然很困难,但是要学习如何良好地设计程序要困难得多,甚至要学习如何设计大型应用程序也要困难得多。事实是,高级主题很难,否则就不会高级。您将需要花费更多的时间来学习它们。有更多时间练习去掌握它们。
至于您能做什么,您似乎专注于成为高级软件工程师的技术方面。与学习语言和框架相比,您可以做很多事情来帮助您的团队创建软件。软技能,例如指导其他开发人员,协商要求,项目管理,程序设计,沟通远见,实施团队规范……所有这些重要内容,对于使开发团队(而不只是您)有效地开发软件而言,都是必需的。