编程很像吃饭。
晚上我饿了。我不在家。我不能到厨房里找点东西吃。我四周看了看,看到只有一家街对面的麦当劳。
于是,我就进入了一个任何时候我离开家、离开我那舒适的小窝后遇到的两难境地:是吃那些垃圾食品,先填饱肚子呢?还是先饿着肚子,等回到家后去吃更健康的食物?
当我在思考这种困境时,我不禁或多或少会把这个问题跟代码质量作一定的联系。当然更多的还是先考虑吃的问题。
我的话只是表达我自己的观点,我并不认为麦当劳是一个能够提供我健康食品的餐馆。作为一个追求绿色食物的人,甚至只是作为一个注意饮食的人,麦当劳的食品远在我的健康食品的标准之下。但是,我相信,跟你们很多人一样,我们已经养成了吃麦当劳里的食物时不再思考这些食物的健康价值了。我饿了,麦当劳里有食物。
既然我已经认识到了麦当劳食物对我身体的短期和长期的影响,我就会全力避免去吃它。对所有预处理过的食物都要这样。这对我来说是漫漫长路。决定去改变自己的饮食习惯并不是一蹴而就的事,
健康饮食是一种持续动作。
很快你就会发现这一切都跟编程有联系。
健康饮食是一种持续动作?
麦当劳的食品不是一种健康食品。然而吃巨无霸汉堡加水果沙拉会比吃巨无霸汉堡加油炸土豆条要稍微健康一些。吃星巴克的金枪鱼会比吃大汉堡要稍微健康些。在本地咖啡连锁店里喝一碗汤要比吃星巴克的沙丁鱼要稍微健康些。在家里吃新鲜蔬菜做的食物要比其它任何地方的食物都健康。
按这样的方式看食物,我们会得出两点信息:
-
所有的事情都是相对的。你永远都可以做到更好,也一直可以做的更差。吃一个巨无霸汉堡并不意味着你会死,而为了能在家里吃饭而忍住一天不进食也未必更健康。
-
每一顿饭都是一个新的开始。人很容易落入这样一种陷进:“既然我昨天已经吃了一个大汉堡,不妨今天就再吃一个了”。这种思考方式是毫无逻辑的,也是有害的。每顿饭要吃什么都是一个新的决定。即使你今天早餐吃了一个大汉堡,午餐时吃家做的食物也是你的健康饮食之旅上前进的一步。
把程序代码当作食物
很像食物,代码质量的保证也是个持续的过程。
从简单层面上我们可以认为,一个没有测试和文档就发布的程序包要比有测试和文档的相同的程序包质量要差。
可是,在这些一眼就能看清楚的问题之外,还有很多说不清楚的东西。没有人都对什么是”健康”的代码有自己的标准。有些人非常清楚自己的编程问题,并在不断的改进自己。有些人数年来一直写着相同烂代码却从来没有想过这些代码是否“健康”。
做出健康的选择
像对待食物那样对待程序代码。
就像你需要吃饭一样,你最终需要发布你的程序。那么,如何处理这短期和长期里的影响呢?
如果你按照吃麦当劳食物的态度,发布了烂程序出去,那么,短期内你的需求是满足了。但从长期看,你将会一直受到它的影响。你的代码将会很难维护,需要你投入更多的精力。它对你长期的生活和健康没有什么好处。
如果你遵循吃家做食物态度,短时间里你的需求可能不会得到满足。这短期的影响是你会饿会儿肚子,但这样做的一个好的理由是:它对你长期的影响是正面的。你的程序代码会更容易维护,bug 会更容易解决,而且需求变更后修改起来更容易。你的程序代码会有一个更长更健康的生命期。

本文的作者 Jesse Storimer
抉择
写健康的代码跟你保持健康饮食一样,需要:认识和承诺。从吃垃圾食品到健康食品需要你认识到有些事情需要改进。对这些认识采取行动需要你对决定作出承诺。
改进你的编程习惯需要同样的事情:认识到有些地方需要改进,并承诺做出行动。
通常来说,你的抉择需要符合实际。你必须要吃饭,你的软件到一定时候必然要发布。找不到健康的食物,麦当劳必须是你的选择。我不知道你的软件项目会有什么样的限制因素,有时你不得不发布烂程序。但你要记住, 健康的编程是一个持续过程。用沙拉换掉你的巨无霸汉堡边的炸薯条。
世上没有‘最健康’的食品。你可以花上一整天来烹饪你认为的最健康的食品,但如果它没有进入你的胃里,就谈不上有什么用处。 代码质量很重要,但如果你不发布它,一切都没有意义。
最好的获得更健康的代码的途径是持续的改进。让你的程序每天都有改进,而不是期望一朝一夕就丢掉你所有的不好的编程习惯、期望以一个全新的更健康的来代替。
分享到:
相关推荐
对于require()饥饿程序员来说,不仅仅是大量生产的烂面包。 依赖 3分升牛奶 50克酵母 50克黄油 0.5 分升糖浆 0.5 茶匙盐 5 分升全麦面粉 3.5 分升小麦粉 安装 将酵母放入碗中,将其分解成小块。 通过测量面粉来准备...
此外,了解并避免并发中的死锁、活锁、饥饿等问题也是课程的重点。 内存管理是高级程序员必须面对的挑战之一。理解内存分配、释放过程,以及如何有效地使用内存池、智能指针等工具,能帮助你编写出内存安全、无内存...
Java提供了强大的多线程支持,面试中可能会考察synchronized关键字、Thread类、Runnable接口、线程池的使用,以及死锁、活锁、饥饿等并发问题的解决策略。理解线程同步与通信机制,如wait()、notify()、join()等方法...
5. **多线程**:线程的创建方式(Thread类、Runnable接口)、同步机制(synchronized、Lock)、线程池(ExecutorService)以及死锁、活锁、饥饿现象等。 6. **IO流**:输入/输出流的基本操作,缓冲流...
并发编程中的死锁、活锁、饥饿状态也是面试中的常见问题。 在网络编程方面,Java的Socket编程模型,TCP与UDP的区别,三次握手和四次挥手过程,以及HTTP、HTTPS协议的基本原理都需要掌握。 数据库操作方面,SQL语言...
4. **线程和并发**:涵盖线程的创建与同步,死锁、活锁和饥饿状态的分析,以及Java并发工具类的使用,如Semaphore、CyclicBarrier、CountDownLatch等。 5. **JVM深入**:讲解虚拟机的工作原理,包括类加载机制、JVM...
3. **操作系统原理**:进程与线程的区别,内存管理(包括虚拟内存、内存分配策略),进程通信方式(管道、消息队列、共享内存等),以及死锁、饥饿和活锁的预防和解决。 4. **数据库知识**:SQL查询优化,事务的...
了解死锁、活锁和饥饿现象。 6. **JVM内存模型**:理解Java内存区域,包括堆、栈、方法区、本地方法栈、程序计数器等,以及垃圾收集机制和内存溢出问题。 7. **IO流与NIO**:熟悉Java的输入/输出流系统,包括字节...
ViewKlass是用于开发Motif应用程序的C ++框架,特别强调了启用可重用组件的创建。 它是SGI的ViewKit(tm)库的克隆。 它源自“饥饿程序员”(http://www.hungry.com)ViewKi
4. **多线程**:理解线程的概念,掌握线程的创建方式(Thread和Runnable),熟悉同步机制(synchronized,Lock,Semaphore等),了解死锁、活锁、饥饿等问题及解决策略。 5. **异常处理**:理解Checked异常和...
- 讨论死锁、活锁、饥饿等问题及避免策略。 5. **IO与NIO** - 学习传统IO流的分类,如字节流和字符流,以及文件操作。 - 理解NIO(New Input/Output)的特点,如非阻塞I/O和通道(Channel)。 6. **反射机制** ...
你需要掌握线程的创建方式(Thread类和Runnable接口),理解并发控制(synchronized、volatile、Lock接口及其实现)、线程池(ExecutorService)的使用,以及死锁、活锁、饥饿等并发问题的识别与解决。 在异常处理...
面试官可能会询问synchronized关键字的使用、死锁、活锁和饥饿现象,以及如何使用并发工具类(如Semaphore、CountDownLatch和CyclicBarrier)来避免这些问题。 4. **设计模式**:面试官会考察你对设计模式的理解,...
4. **多线程**:Java的并发编程是难点,面试可能会问及线程的创建方式,同步机制(synchronized、Lock等),死锁、活锁、饥饿现象,以及线程池的使用。 5. **JVM**:面试官可能要求解释JVM的工作原理,如类加载机制...
还要掌握死锁、活锁和饥饿现象及解决策略。 5. **IO流与NIO**:熟悉Java I/O流的分类(字节流和字符流)、流的连接与转换,以及缓冲区的概念。新的NIO(New Input/Output)提供了非阻塞I/O操作,提高了读写效率。 ...
5. **并发编程**:Java并发库(如synchronized、volatile、ThreadLocal、Lock、ExecutorService、Future等)的理解与应用,线程池的配置与优化,以及死锁、活锁、饥饿现象的预防和解决。 6. **JVM原理**:包括类...
- 同步机制:掌握synchronized关键字,死锁、活锁、饥饿的概念,以及如何避免它们。 - 线程池:理解ExecutorService,ThreadPoolExecutor和Future接口的用法。 4. **IO与NIO** - 流的概念:理解字节流和字符流,...
面试中可能会让你编写并分析多线程同步的代码,或者讨论死锁、活锁、饥饿等问题。 五、JVM优化 理解JVM的工作原理及其内存模型至关重要。面试中可能会问到垃圾回收机制(如新生代、老年代、CMS、G1等),JVM参数...
- **死锁、活锁和饥饿**:面试中可能要求解释这些并发问题及其避免策略。 3. **JSP方面** - **JSP生命周期**:包括翻译、初始化、服务和销毁四个阶段。 - **EL(Expression Language)**:用于在JSP页面中访问...
5. **多线程**:掌握线程的创建、同步、通信(如wait/notify,Semaphore,CountDownLatch等)以及线程池的使用,理解死锁、活锁和饥饿现象,能解决并发问题。 6. **网络编程**:理解TCP/IP协议,会使用Socket编程,...