以何种目的选择编程开发书籍?我对选择编程开发书籍的反思和总结。

选编程开发书籍之前,应确认抱着何种目的(进行编程开发)?

目的:实际项目/工程、商业成功、快速开发、非课堂书籍
而非:课堂书籍、学院派、技术研究

软件开发目标
==========

根据行业性质,不同的领域/产品对性能的考量不同,不可一刀切(选书、技能训练、学习计划)。

什么是行业范畴:
1. Web 开发、嵌入式开发、平台中间件开发,这些都不是行业划分。只是技术。
2. 行业划分是指:金融领域、游戏开发、电信通信,如此的划分。

一个行业范畴可继续细分(以体现技术或市场目标),如游戏开发:
移动游戏/手游、桌面游戏、Web 页游、主机游戏

本文目标:游戏开发这种对产品的完整性要求很高的领域。
一个好的游戏首先是一个完成度很高的产品,胜于技术领先但不完整的游戏(完整性包括可玩性、游戏元素概念和艺术方面)。

不同的公司/团队(规模、资源、市场)也有着不同的目标:
研究型 vs. 开发型
成熟型 vs. 创业型
本文目标:开发型 + 创业型

一般情况下,应以功能性为先。
软件开发的第一目标是:实现最少的完整功能(最小集合),使其成为可发布的产品。

警惕以下关键字/书名
====================

警惕所谓的高性能编程:

高效 (Efficent)
高性能 (High Performance)
高可靠性 (Hgih Reliability)
大规模的 (Large Scale)
高安全性 (Security)
可扩展的 (Extensibility)
可伸缩的 (Scaleable)

不要首先/过分考虑以上概念,原因:
1. 会打乱优先级,喧宾夺主,影响聚焦和专注于产品。
2. 影响思维的连贯性、行动/开发的重点。
3. 它们是锦上添花,而非雪中送炭。

警惕所谓的优秀的编程设计:

程序设计模式 (Programming Desgin) vs. 领域设计 (Design in Domain)
适度学习前者并保持警惕,重视后者

在工作问题中修炼对数据结构/算法的学习(将数据结构应用于实际领域问题),警惕通过数据结构/算法习题刻意训练。
即便读过市面上所有的数据结构/算法的书籍,会做所有的习题,也说明不了就能解决实际领域问题,出力不讨好。
先找一本合适自己的数据结构/算法的书籍通读(正文精读),然后进入实际领域应用(把书当作参考用),如将图论应用在游戏地图寻路、将 BST 应用在游戏场景/物品管理。

不好的气味
==========

跟风潮流。警惕热门技术名词、好新奇。
知识广度可通过杂志期刊略读翻阅获得,锻炼快速阅读和裁剪知识的能力。
真正的知识还是要靠系统的书籍/教程学习,并加以实践。博客文章、碎片摘录、杂志期刊、零星技巧都不是学习知识的有效途径。
真正有价值的知识广度是跨学科领域的知识,而非多种编程技术,如对游戏程序员来说,修炼美术/艺术、设计和策划的技能。

没有重点和偏向的学习,不深入高级开发和累积经验,过长时间停留于通用编程 (General Programming)。典型反例:又 Windows 又 Linux,又 Web 又 C++。
游戏开发是极重领域知识 + 改进实践 + 跨学科,是离通用编程很远的范围。

纠结于技术末节、陷入问题论:自底向上的堆积技术碎片,不利于收敛到一个完整概念的软件/产品。

预知问题(不值得),臆断假设问题的出现(如猜测改进一个高性能服务端将提高网络吞吐性能),不利于具体现实问题的解决。
原因:不可能完全预知问题,那样的代价过高(学习和开发),应首先遇到实际问题(确实遇到网络性能瓶颈,并经过验证确认),然后去找解决方法,结果 -> 反馈 -> 改进,在实践改进中完成高性能服务端开发的学习,最后将成功和有价值的改进方法和学习方法总结,形成个人/团队知识库、企业资产库。
早期的设计需要一种可扩展的,但又不至于太复杂的架构,以支撑改进。但可扩展的设计本身也会带来复杂性(学习和开发),需要权衡和经验累积。

职业规划 => 做程序员 (General Programming)
引入复杂性
拖延项目
工具异化
捣鼓/钻研技术的技术宅

好的原则
==========

大局观:自顶向下的设计和规划、长远的有步骤的计划

放下技术包袱:成功的软件不需要顶级的技术,而需要适当技术的应用

保持技术的简单性和直接性 (KISS)

职业规划 => 做行业专家、领域开发者 (Domain Programming)

可工作的软件、完整的功能(产品)
可交付的产品
快速开发 (RAD)
可盈利的商品(运作)

Good Artist Copy, Great Artist Steal. 集成和采纳已有工作:DRY、类库、中间件、引擎、设计、运作方式、模仿和改进(但不要流于表面的抄袭和山寨)
敏捷 (Agile)、精益 (Lean)、重视任务和时间管理 GTD (Getting Things Done) http://en.wikipedia.org/wiki/Getting_Things_Done

软件开发第一原则/目标(开发者的信仰和本源):创造实物、应用为先、产生价值
开发者的第一愿望:创造优质产品(梦想中的游戏),产生价值和回报,服务和满足生活,成为人生的赢家

请抱着以上的原则,结合自己的行业领域(游戏开发)和职业规划 (Gameplay Programmer) 去选择编程开发和相关书籍。


文章出自http://www.douban.com/note/241452309/