——读《编程珠玑I》有感:程序员
Program.Program better. Program faster.正则表达式
要从事软件开发,首先要学会编程。如何编程呢?如何编写更高效更优雅的程序呢?《编程珠玑》经过简单而熟悉的示例,揭示了许多很是有益的编程原理和技巧,极具启发性。算法
基本流程:数据库
问题定义—— 应用框架与界面设计 —— 选择合适的数据结构和高效的算法(对象和消息)—— 性能估计 —— 接口声明 —— 伪代码 —— 程序验证—— 编码 —— 测试与调试 —— [代码优化]—— 代码重审和回顾。编程
问题定义:赢在起点。清晰明确的问题描述和定义几乎决定成功的一半。做为问题求解,如何正确地理解问题,从何种视角去思考问题,每每会产生天壤之别的结果;做为软件开发,“有所为而有所不为”,应看成为基本准则。谁都指望可以开发出性能强劲的、多能多才的软件,但并非谁都可以承受这样的研发成本(时间、资金和人力)。在成本与所能得到的最终产品之间,必须做出合适的权衡和折衷。缓存
通过良好抽象的问题,更容易获得可复用的问题解决方案。好比,《编程珠玑I》第12章,取样问题,从随机选区列表抽样,抽象成“从n个整数中随机抽取m个有序整数”的问题;这样,问题的解决方案还能够用于其它领域的抽样问题。安全
应用框架和界面设计: 在明确问题的求解目标以后, 就要思考如何求解问题了。 一般会有一个初步的思想,而后逐渐造成整个比较成熟的方案和应用框架。 与此同时, 定义良好的界面设计也是很是关键的。 在界面之上, 是依靠界面服务的应用程序的实现; 在界面之下, 是用来提供界面服务的数据结构与算法的实现。 网络
数据结构与算法:掌握一门语言,就能够开始编写程序;而数据结构和算法,则能够帮助写出更为强大的程序。 粗浅地将《编程珠玑》阅读了一遍,发现:计算机程序的根本仍然是: 数据结构 +算法。数据结构和算法一般仍是估算和提升系统指望性能的关键环节。数据结构
对象和消息, 其实是数据结构与算法的封装。 在面向对象程序中, 每个类都是一些绑定在一块儿的“小数据结构”和“小算法”的携带者, 经过接口提供本身的服务;每个对象都是状态携带者, 经过状态的变化来表征系统的变化,从而实现系统的特征和功能。架构
数据结构有着很是重要的做用。有时候,复杂的逻辑,只要借助必定的数据视图,就能获得很大的简化,好比日期计算。《编程珠玑I》中谈到的重要数据工具备:超文本、值-对、字典、数据库、表格、模板等。
性能估计:一般,经过算法的大O分析来粗略了解系统可能达到的性能;另外,必定的粗略估算能力也是很是必要的(见编程珠玑第七章):常识、关键参数、经验法则、量纲检验、安全系数。
接口声明:涉及到系统的设计。系统由哪些数据结构(或对象)组成,它们如何进行交互(函数,消息)以完成系统的功能; 仔细定义每个接口的声明(功能描述、参数列表、返回值、前置条件、后置条件),并使之良好地协做。
伪代码:不要急于编程。使用伪代码来表达思路,勾勒程序的大体框架。这经常也会让思路更明晰:由于在这个过程当中,一般能够发现系统有哪些子功能要实现,有利于模块化。
程序验证:你能保证本身编写的程序在任什么时候候都正确吗?仍是仅在你视线所及的范围内正确?你指望写出的程序仅仅是看上去正确吗?固然,咱们都但愿可以早早完工,但是,急不得,懒不得。学习必定的程序验证技术,也是有益无害的事情。虽然起初可能麻烦一点,但一段时间习惯以后,就不会以为怎么样了。万事开头难,过了槛就行了。
程序验证的经常使用方法:循环不变式和断言。这其实是根据三种控制流来确立的技术。
编码:终于能够编写程序了。恐怕通过上述折腾,编写程序的兴致早就减得不剩多少了。但是,一切,都是为了编码更加顺利,更加有创造性。总不指望发现,编码就是在Ctrl+C/V;当编码到必定程度时,忽然卡了壳;忽然发现思路有问题;忽然发现性能没法知足所指望的;忽然发现,以前的努力都白费了?
不少人抱怨工做中的编码没有创造性可言,但是,有没有想过,你不去思考如何更有创造力的写程序,难道指望创造性自动跑到你面前吗?你不去努力使用算法、数据结构,难道它会自动跑到你跟前要求你去使用吗?你不去主动思考、勤于发现,难道你就期望奇迹自动降临于身?
编码时,尽力遵循良好的代码规范,使之可读性良好,为后面的代码重审和回顾打下良好的铺垫。
测试和调试:如何获得一段值得信赖的、能够放心复用的程序呢?苛刻的、完全的测试。不要怕麻烦。凡事习惯就行了。编写自动化测试;掌握使用断言来进行调试。
程序测试一般能够分为两种: 自动化测试和手工测试。对于小数据集,0-10,能够构建自动化测试;另外,还要构建手工测试,使得可以对特殊情形进行测试。
代码优化: 代码优化一般意味着性能的小幅提高。一般是应用缓存原理,这须要对计算机组成和操做系统有深刻的理解。代码优化一般意味着程序可靠性、可读性和可维护性的下降,程序复杂度的增长;所以要慎重进行。
代码重审和回顾:没有总结就没有进步;“写了代码就丢弃”也不能指望有进步。经过代码重审和回顾,进一步改进代码的质量:可用性、可读性、可扩展性、可移植性、安全性、可靠性。
其它:
大数据集处理问题:初学者可能一般会考虑 1– 100 以内的小数据集处理;但进入到软件开发领域,大数据集处理,海量数据处理,就成了一个必须考虑的问题。对于排序问题来讲,当n < 50 ,或许采用插入排序就能够了;但当n等于几百万,几千万时,就不能采用插入排序了。这说明:小数据集的处理方案和大数据集的处理方案每每会是迥然不一样的。
实用程序和工具箱:卓越的工匠都会备用本身喜好的工具箱。程序员也不例外。初学者可能主要在于编程练习;但进入必定阶段以后,就必须考虑编写实用性强的工具和程序,而不是总停留在玩具程序的级别上。
标准库;实用程序;熟悉的IDE;开源小工具;经常使用数据结构;算法技术;正则表达式;数据库使用;编程技术;编程技巧;设计思路;问题求解方案;错误录;等等。
自动化重复工做:时常注意平常生活中是否有可以自动化的重复性工做,并经过编写实用程序和工具去简化它。若是当时由于时间来不及,那么,事后也应当尽力补上。
习惯的变革:人天性一般都是“能躺着就不站着”的,所以,培养了不少很差的习惯。程序员呢,一般指望可以快速编写出知足功能的程序,而后运行察看是否如预期,接着便丢到一边再也不理会了。什么问题分析、伪代码?什么程序验证、测试?什么代码重审和回顾?都扔到一边去。结果是,你逃掉了一分钟的测试时间,却用了将近一小时调试时间来补偿。划得来吗?
其实,培养好的习惯,是一种一本万利的投资。只要最初一两个月坚持住,习惯成天然;以后,你便只是尽享好习惯带来的益处了。
从编程到软件开发
从某种意义上来讲,在懂得《数据结构、算法技术、操做系统、组成原理》这些专业知识以后,再加上“勤于思考,善于追根究底”的探索精神,以及大量的编程实践,就能够逐渐掌握编程的基本原理和能力。
在学会编程以后,就能够阅读关于软件架构的书籍了,理解软件是如何构建起来的。数据库,计算机网络等等,实际上也是经过“编程原理+软件架构”的产物,只是它们能够被用来做为更大系统的组件。