不仅仅是写代码,而是完成作品

近来有人问起,现在似乎真得变成了码农,日出而作,日落而息。整天不停的写代码,开发业务需求,周而复始,日子长了,感到厌倦。有时回想,应该在过去的某个时期我也曾陷入过这样的循环中,后来又是如何脱离的呢?

代码与缘由

这要回归到从写代码这件事上开始。写代码是因为有需求,需求来自业务的发展需要,需求经过产品经理再传递到程序员。

刚开始,作为一个新手程序员,不停的为各种需求写代码。开发完一个,接着又是下一个,生生不息,循环不止。一开始也许会感觉有些累,但并没有产生太多的厌倦。这是一个从不熟悉到熟悉再到熟练的过程,这里有太多的新东西可以去探索和尝试,让你在疲惫中依然获得了好奇心的满足,因此不会感觉厌倦。

但从不熟悉到熟练需要多久呢?现在成为专家的要求已经有了共识:一万小时的刻意练习。但达成熟练要不了那么久,也许两三年足以。有句俗语叫:条条大道通罗马。罗马,一个城市,包罗万象,对于程序员就像一个个需要完成的业务需求。几年过去,每一条通往罗马的大道都被你走过了,再去往罗马时,自然找不到新鲜感了,困倦油然而生。

继续在罗马的循环往复,已无法让你继续成长为专家。罗马也许在中世纪曾是一个伟大的城市,但时代在发展,未来会有更丰富的城市超越他。跳出循环的路无非就是走出熟悉的罗马,不再去走那条条通往罗马的大道,而是选择一条离开罗马的路,走向未知与未来。

在一万小时的刻意练习中,罗马已是过去的熟悉熟练区,离开罗马便是要进入下一个陌生的学习区。

产品与作品

写代码,开发需求无非都是为了完成产品。产品作为一个整体,包含了一份份零碎的需求和代码。

有时我们会把一个产品作为整体当作一件作品,但并非所有的产品都能称为作品。维基百科上对作品的定义是:

作品,亦称创作、创意、著作,是具有创作性,并且可以通过某种形式复制的成品。

从这个约定俗成的定义看,作品最重要的特质是:创作与创意。所以,只有包含了创意(作)性质的产品才能叫作品。那么像 iPhone 这样的商品就既是好产品也是好作品了。

那么对于程序而言呢?代码是作品么?可以是的,小到一段函数,一个类,大到一个服务,一个系统,在你编写程序时都可以把它们当作一件作品来完成。就像一本书是作品,书里的每一篇文章也是作品。

吴军曾在文章里写过:完成一件事,做到 50 分靠常识和直觉,做到 90 分要靠科学和技艺,而要做到 90 分以上则要靠艺术。我是认同这个观点的,完成作品的目标是 90 分以上,这是作品的特性决定的,因为创作就是艺术的核心所在。

如果写代码仅仅是完成需求,即便是完美无瑕的完成了需求,也只是 90 分的标准。经过了科学地学习和训练的程序员们,自然是超越了 50 分,但却还达不到 90 分。你想做到 90 分,也许需要一个比 90 分更高的标准。iPhone 作为一个 90 分以上的作品,就是 90 分的工程技术加上几分的艺术,相比差几分的同类,在市场上的价值和价格却是相距甚远。

为什么要把条条通往罗马的大道都要走完,甚至反复走。具体到编程写代码,无非就是不停的重构,打磨作品。成长的路上,写过的代码最终也许会烟消云散,但完成的作品会成为你点亮的勋章。

显性与隐性

梁宁以前写过一篇文章《在腾讯的第一堂产品课》,其中提到了产品的显性与隐性特征。显性的东西容易看到和体验到的,所以文中说到:

过分强调显性特性的,菜鸟之中的最初级。过去,我最怕的就是听谁说,我们要改版了,新版哪天…显性特性很重要,但是显性特性救不了你。把核心资源与时间,放在一次次优化显性特性上,基本上是互联网初级从业者的狂热症。

这是指产品的显性和隐性,初级的产品经理更容易关注到显性特征的体验变化和改进,但更高级的产品经理会关注和产品相关的服务、流程与成本等隐形特性。但产品经理关注的这些特性,无论是显性的还是隐性的,到了程序员这里的技术方案将全部是显性特性。

有个说法,要做好技术需要懂业务和产品,大体没什么问题。但需要提的细节是,是懂的方向。技术不需要了解业务产品的每一个显性特征,一个足够大的业务产品,有无数的显性特征细节,这些全部的细节可能分散在一群各自分工的产品经理们中。技术需要懂得是产品提供的核心服务和流程,并清晰地将其映射到技术的支撑能力与成本上。

另外,技术不仅仅需要支撑满足产品的全部显性和隐性服务特性,这些都是技术的显性服务特性。但技术还有自己的隐性服务特性,这一点恰恰也正是高级和资深技术或程序员需要重点关注的。所谓技术的隐性特性,通俗点就是程序员常说的非功能性需求,它的产生与来源都是源自程序和程序员本身。

用一段新算法实现的函数取代了旧函数,那么多余的旧函数就变成了负债而非资产,是需要去清理的。重构代码变得更简洁和优雅,可读性增强,节省了未来的维护成本。一个能同时服务一万人的程序实例,你知道你没法加十个实例就能简单变成能同时服务十万人的系统。这些都是技术冰山下的隐性特征,显性的错误会有测试、产品甚至最终用户来帮你纠正,但隐性的错误却很难有人能帮你发现并纠正。

一旦隐性的错误爆发,就像泰坦尼克号撞上了冰山,一切外显的繁华最终都将沉入海底。初中级的程序员都在关心能否完成这些显性的功能,而更高级的程序员则需要更多关注这些隐性的技术特征带来的风险和代价。

用正确的方式做正确的事,而那些隐藏在冰山下的正确的事,表现型的人是不愿做的,而进取型的人才会去做,得到的奖赏是自己的进步与成长。

大部分的技术“火灾”,都是隐性风险的爆发。一场大火过后,救火的英雄会站在聚光灯下,而你的系统隐藏于一片繁祥安宁的黑暗中。不深藏一点功与名,谁又愿意去推动这样一些默默无闻但正确的事情呢。

让正确的事情相继发生,你的成功或默于悄无声息,但你的失败却震于惊天动地。

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值