热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

为了快一点,我们却要慢一点。

​爱因斯坦说,教育就是“把学校里学到的东西忘了后”剩下的东西。那么,如果真的习得了教育,那么,从科班到丛林,只差一个隐藏信息积累的过程,这是可以通过大量实践来达到的。头脑的灵活是不会因

    ​爱因斯坦说,教育就是“把学校里学到的东西忘了后”剩下的东西。那么,如果真的习得了教育,那么,从科班到丛林,只差一个隐藏信息积累的过程,这是可以通过大量实践来达到的。头脑的灵活是不会因为环境的变化而改变的。而如果在教育中得到的只是信息,而没有磨练出能力,那么在丛林中,将举步维艰。

    ​​将代码分层,是为了控制复杂度,让你的管理更加有条理。那为什么非得要建立多个不同的独立文件夹,再创建不同的文件呢?

     ​一个直接的考虑是,在同一个文件下,也就是同一个文本环境之下,当然会有非常大的自由度去增添代码,没有任何的条款限制。但同样是因为这样的“自由”,它会让管理处于失控。因为控制复杂度,就意味着将多个不确定性的东西固定下来,就需要有强制性的限制,而不是自由。有了更多的限制条件,才能让你控制的主体按照你的思路去发展,去向同一个方向用力,而不是散沙一团。这是一个经典的因为有了更多的局限性,反而让系统发挥出更强大的力量的例子。正如山路赛车,为了更快一点,就必须要用更小的马力。

     ​所以,为了让你的“UI部分的代码成一堆”,“数据连接的代码成一堆”,“业务逻辑的代码成一堆”,你必须给予这些部分强硬的限制,让它们只能在特定的范围内出现。这就需要创建不同的文件夹,以及不同的源代码文件。其背后的思维方式是:要用制度去控制组织,而不是依赖组织中每个成员的自身素质;要用代码去控制流程,而不是依靠脑海中的行为规范

    ​ 另一个需要提到的优势是,通过不同的文件创建以及不同文件夹的划分,可以很好地解决名字冲突。每一个模块都可能提供一些相同的功能,但却需要不同的实现。如果你将所有这些“具备相同功能但需要不同实现”的函数放在同一个文本环境下,你将难以区分这些函数,并且会造成冲突。你当然可以通过增添前缀的方式来解决冲突,但这样会造成函数名的臃肿。但更为关键的是:如果你真的写过稍微复杂一点的系统,你会发现在“数量庞大的一堆没有分类”的文本中寻找一个代码片段是件多么让人焦躁的事情!你完全无法在一堆字符中自然地观察到内在的一致性和规律性。而这种“混乱”以及由此产生的焦虑,正是你控制复复杂度的原因。

     ​同样的现象还可以在数据处理中发现。如果你是通过Excel去处理简单的数据,你会发现它非常灵敏好用。可是,一旦数据之间的相互依赖关系有所增加,并且还有其他合作者的参与,崩溃的事情就会发生。你会发现,正是因为它的类似于一张白纸的高度灵活性,你发现你竟然难以将你们商讨的“规则”强制性地实施在表格之中。为什么?因为你缺乏限制,缺乏代码为你勾勒出的硬性框架。你可以任意地修改一个单元格的内容,也可以轻易地增添一些附加信息作为旁边的备注。假以时日,你会发现你的表格中的信息混乱不清。虽然你已经早已向你的同事、你的朋友说明了该做的事情和不该做的事情,可是,这毕竟是软性的东西。违反这些规定,并不会给予违反者以压力或惩戒。同时,它灵活的增添功能,让很多数据依赖关系成为了一纸空文。

     ​Programming,如同任何的实务实践领域,一个首要的基础是大量地建立你的工程实践经历,这是一切的前提。如果没有真正的实践经历,很多业界的行为规范和行为准则是无法被正确理解的。如同上面所举的例子,如果你的代码复杂度不能跨过一定的基准线,你是无法真正体会到“创建不同文件夹和不同文件”的强烈需求的。对于toy program来说,增添不同文件行为方式,反而会减少代码的可读性,让代码晦涩难懂。从入门者的内心来说,在这个层面的是无法理解它的好处的,因而也就无法知晓它在何种情况下才能被称之为好。并且,一个附带的坏处是,你往往不敢或者难以承认你无法理解“将代码分裂在不同文件的好处”。因为几乎所有有经验的从业者都会告诉你,这样做是好的。一旦应该被提出的问题被忽略,那么你将再也无继续深入,真正去理解背后的“所以然”。

     ​另一个容易让你停留于表面无法做出真正评判的要点是,你会片面地去理解一些术语,如刚才提到的“灵活性”或“局限性”。就字面意思来看,当然是越灵活越好啊。可事实是,如同上面的论述,“灵活”与“局限”从来不是孤立存在的,也不是被孤立地评判的,它是需要有“语境”的,是由你的实际问题的规模和目标所决定的。如果你的任务不是太复杂,或者仅仅是停留于头脑风暴的设计阶段,上帝视角的灵活性(也就是白纸式的灵活性)会给你带来巨大的优势。另一方面,如果你需要建立某些规则,那么你应当建立一些框架去做限制,让“局限性”成为你控制复杂度的强大工具。

    ​ 更进一步,如果你讨论的“语境”是代码重构,或者集中于框架建立,“灵活”与“局限”的意思或者效果又会颠倒一转。在你的框架构建中,你需要找到的是一种合理的组织方式,使你的系统能够灵活地增添新的代码。而不至于被“糟糕设计”绊住:难以找到一个合适的位置去增加代码,因为似乎每一个代码片段都有着特定的限制性,一旦增加新的片段,就会破坏原有组织。在这种情形之下,“灵活”就成了值得追求的目标。

    ​ 那么,有了以上两段讨论后,一个直接的问题是:那我如何知道何时该追求“灵活”,何时该追求“限制”呢?或者更一般地说,如同生活中的矛盾说法“胆大/鲁莽,严密谨慎/畏首畏尾,多才多艺/三心二意”如何知道该追求什么?又该如何知晓在什么情况下、运用什么样的特性或品质呢?答案即是:大量的实践!如果考察丛林生活与科班环境,它们最大的分界点便是对于这些潜在规则的判断。无论你是学富五车或者具备多深厚的理论建树,如果你没有在特定的领域中积累足够多的实践经历,你将无法去获得潜藏在背后的规则信息,或者真正明白术语背后的具体所指、业界规则的前提条件、看似简单的业务逻辑背后所隐藏的坑。而这些潜在的东西,才是在丛林或者社会生活中生存的重要资本。



推荐阅读
  • 解决.net项目中未注册“microsoft.ACE.oledb.12.0”提供程序的方法
    在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报错“未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序”。本文提供了解决这个问题的方法,包括错误描述和代码示例。通过注册提供程序和修改连接字符串,可以成功读取excel文件信息。 ... [详细]
  • 本文介绍了Python对Excel文件的读取方法,包括模块的安装和使用。通过安装xlrd、xlwt、xlutils、pyExcelerator等模块,可以实现对Excel文件的读取和处理。具体的读取方法包括打开excel文件、抓取所有sheet的名称、定位到指定的表单等。本文提供了两种定位表单的方式,并给出了相应的代码示例。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 怀疑是每次都在新建文件,具体代码如下 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • 我们有(据我所知)星型模式SQL数据库中的数据文件。该数据库有5个不同的文件,扩展名为 ... [详细]
  • 本文介绍了一个免费的asp.net控件,该控件具备数据显示、录入、更新、删除等功能。它比datagrid更易用、更实用,同时具备多种功能,例如属性设置、数据排序、字段类型格式化显示、密码字段支持、图像字段上传和生成缩略图等。此外,它还提供了数据验证、日期选择器、数字选择器等功能,以及防止注入攻击、非本页提交和自动分页技术等安全性和性能优化功能。最后,该控件还支持字段值合计和数据导出功能。总之,该控件功能强大且免费,适用于asp.net开发。 ... [详细]
author-avatar
king
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有