The Kollected Kode Vicious

Kode Vicious - @kode_vicious

  下载本文的PDF版本 PDF

代码牛仔们,准备好了

KV是一个有个性的程序员,他回答你的问题。但他可不是礼仪小姐。

本月,KV为正在考虑成为全职程序员的读者提供建议。他建议新程序员通过阅读杂志、期刊和网站来尽可能多地学习知识。还有什么地方比这个专栏更适合进行这样的学习呢?我们的豪华精装版《Kode Vicious 合集》可能还要一段时间才能出版,所以在那之前,我们建议您访问 http://www.acmqueue.com,在那里我们存档了所有过去的 KV 专栏,方便您快速轻松地参考。

尊敬的 KV:

我是一名 IT 顾问/承包商。我主要从事网络(我是思科认证网络工程师)和微软操作系统(微软认证系统工程师)方面的工作。我从事这项工作已经超过八年了。不幸的是,它开始让我感到厌倦。

我的问题是:我该如何重新开始编程?我说“重新开始”是因为我有一些经验。在高中时,我上了两门 Applesoft BASIC 编程课程(我知道,这很古老了)。我非常喜欢它,所有科目都拿了 A,并且是老师见过的最好的编程学生。这激发了我对计算机科学的兴趣,我在大学里也选择了这个专业。

在大学里,我学习了 C++、Java 和 Web 开发(HTML、XHTML、JavaScript)课程。我做得很好,也很有乐趣。由于各种原因,我最终离开了大学,成为了一名网络管理员,并在过去的八年里一直在做这项工作以及其他各种与 IT 相关的工作。但我一直没有编程。我的编程工作经验仅限于 MS Excel 宏(真讨厌!)和 Microsoft Access 中的基本 VB 编码。

那么我该如何开始成为一名程序员呢?Visual Studio 2005?Java?Eclipse?我喜欢自学,并且发现获得认证可以让我更容易入门。有没有我可以获得认证的特定套件,以便让我的新职业生涯顺利起步?

提前感谢。

渴望工作的人

亲爱的渴望者:

等等,你已经把你的工作做得如此出色以至于感到厌倦了?为什么不开始打高尔夫球或绘画呢?也许从互联网上下载更多“内容”!你到底为什么要放弃一份你熟悉的工作去成为一名程序员呢?!难道你不知道程序员要长时间工作才能赶上不可能完成的最后期限,而这一切都是为了让一群富人更富有吗?

好吧,如果你看到这里,那么我想我应该实际回答你的问题。当然,对于你的问题,答案和程序员一样多。你如何转向编程工作取决于一些因素。首先是,“你喜欢做什么?” 如果你不喜欢,那么努力学习一门语言或一个系统就毫无意义。你最终只会回到你现在的位置,想要做其他事情。找到你喜欢解决的问题类型,然后看看现在是如何解决这些问题的,看看这是否是你喜欢做的事情。

既然你说你已经有计算机科学背景,我真的看不出有什么特别的理由去追求任何特殊认证。我从来没有看到大多数认证的意义,因为它们只证明你可以通过考试,而不是你可以思考问题,而这才是更重要的技能。我也认为你不应该担心你现在使用哪一套工具。还有其他事情要处理,比如第二步。

第二步,值得庆幸的是,没有 12 步,是选择一个项目。除非我有一个围绕我想学习的东西的项目,否则我什么也学不到。尝试选择一些你认为你实际上可以做的事情。“编写一个操作系统”,虽然这是一个有趣的目标,而且实际上是可能实现的,但可能不是一个好的起点。参与一个开源项目,例如 FreeBSD、Apache 或 Open Office,可能是另一种入门方式。找到一些你需要经常使用的东西,并尝试扩展或修复它。大多数开源项目都有长长的未解决错误列表。选择其中的一些错误,尝试修复它们并将补丁提交给维护者。

最后,抓住一切机会学习你新领域的知识。这并不意味着花费大量金钱——或者欺骗你的雇主花费大量金钱——在课程和会议上。当然,如果你在夏威夷找到一门课程,而你的雇主愿意送你去,好吧,我无法反驳,但我也不能称之为学习。相反,定期阅读涵盖你新发现的专业领域的期刊、杂志和网站。

一旦你认为你具备开始新职业生涯的条件,就看看入门级职位,这将使你能够学习更多。做好降薪的准备,因为从八年网络管理经验转向入门级编程不太可能在金钱上获得巨大收益,但你是为了乐趣和挑战而做这件事,对吧?

KV

尊敬的 KV:

由于性能需求,我的团队正在重做一些旧代码,使其能够多线程运行,以便它可以利用现在高端服务器中出货的新型多核 CPU。我们估计至少需要六个月的时间才能分解我们的软件,使其足够精细以多线程运行,并实现所有适当的锁定和临界区。我在线上偶然发现了一个旧演示文稿,“线程有害论”,想知道您对此有何看法。这篇论文是在我们拥有多核 CPU 之前很久写的。当时商业 SMP(对称多处理)机器很少,所以当时花所有力气编写线程代码可能没有意义,但现在情况不同了。您听说过这篇论文吗?您认为它现在仍然有效吗?

悬而未决的...

亲爱的悬而未决者:

John Ousterhout 的警告(为什么线程是个坏主意 [对于大多数用途],1996 年 Usenix 技术会议)今天和它写出来时一样重要,不是因为时代和技术已经改变,而是因为,唉,人没有变。大多数人似乎为了你在这里陈述的原因而决定创建多线程代码——也就是说,为了从中获得所谓的性能提升。这些人似乎从不费心测量他们的代码,或者看看在多个线程中运行它是否实际可行。他们只是开始切割代码,徒劳地希望如果他们有足够的线程,突然之间,就像变魔术一样,他们的代码会运行得更快。

KV 的长期读者会知道我不相信灵丹妙药。在你的代码上挥舞一根标有“线程”的魔杖,就像牺牲一只鸡一样,不太可能让它运行得更快。至少当你完成鸡的牺牲后你可以吃鸡,这比我对你的代码所能说的要多。实际上,线程化你的代码可能会使其运行速度变慢,因为编写不佳的线程代码通常比编写不佳的非线程代码更慢。正确获取锁所需的锁定原语并不简单,如果使用不当,可能会减慢你的代码速度,因为它都阻塞在同一个锁上,或者更糟糕的是,可能会引入细微的错误。

线程代码的另一个问题是,用于调试它的工具仍然很原始。虽然现在大多数调试器都声称可以正确处理线程,但情况并非总是如此,你真的不想在调试你的代码时还要调试你的调试器。

人们在匆忙线程化他们的代码时错过的最后一件事是他们从他们链接的库中获得的支持。如果你的程序要求它使用的库是多线程的,那么当你意识到其中一些库不是线程安全的时,你可能会感到震惊。在你的线程安全程序中使用非线程安全库将给你带来无尽的麻烦。

鉴于所有这些,你还应该继续线程化你的代码吗?也许吧。首先你需要了解权衡,看看代码所做的工作是否适合多线程处理。如果代码有几个可以完全独立运行的组件,那么是的,多线程可能是一个福音。另一方面,如果组件都需要一直访问一小部分共享数据,那么线程将一无所获。你的程序大部分时间将花费在获取、释放和等待保护共享数据的锁上。

所以,除非它真的是一个优势,并且你已经认真考虑过它,否则我建议尽量不要陷入线程的困境。

KV

KODE VICIOUS,凡人称为 George V. Neville-Neil,为了乐趣和利润而从事网络和操作系统代码的工作。他还教授各种与编程相关的课程。他的兴趣领域是代码探险、操作系统和重写你的糟糕代码(好吧,也许不是最后一个)。他获得了马萨诸塞州波士顿东北大学的计算机科学学士学位,并且是 、Usenix 协会和 IEEE 的成员。他是一位狂热的自行车爱好者和旅行家,自 1990 年以来一直以旧金山为家。

acmqueue

最初发表于 Queue 第 4 卷,第 8 期
数字图书馆 中评论本文








© 保留所有权利。

© . All rights reserved.