《Spring实战 第四版》是基于Spring 4而编写的,想对于Spring 3功能增强了很多,而且也适配了很多的第三方的工具,便于适配DevOps的趋势。整体的知识点整理如下:
《Java 8 实战》读书笔记
Java 8较之Java 6确实提供了很多新的功能,有些功能实际上是沿用了一些第三方库,比如:Google Guava。核心是函数式编程,其它的功能都是为了支持这个核心功能而提供的。
《Spring Boot 实战》阅读笔记一
如下图:
Optimize basic windows 7
移除了一些服务,win7启动内存降到了1.3+GB。
一些写代码的思路
- 开源软件那么多,能用现成的,绝不重新造轮子。我们要做的,首先是整合,然后才是重新创造。
- 歌手界,姚贝娜和周杰伦代表了两种方向,一个是演绎,一个是原创。能做到顶级的,都是很牛逼的。
- 自我定位也包含了一种设计,比如在安态的工作,要面对业务、IT高层、限制非常多的开发环境,要有设计、要有架构。
- 始终相信行业间,抽象层次高了以后,是相通的,就像第2点说的那样。多学学能看见的牛人,他们在干什么。
写在CSD培训之后
先前参加了公司组织的CSM培训,本身作为一个开发还是有点迷茫的。虽然Scrum敏捷开发实践从整体上,看起来解决了一些问题,但介绍方向偏多,更多的是在介绍敏捷开发方法论。并没有介绍如何实施敏捷开发。CSD培训正好弥补了这一点。
CSD培训总共分三天,三个主题:TDD,重构和持续集成。这三个主题正好解决了我先前的疑惑,分别说一下我的看法。
- TDD
对TDD印象比较深的是下面这个图。
这个图展示了,一种开发方式的转变需要付出很大的努力。事实上,TDD也不是非常陌生的东西。但是它会对现有的开发方式有很大的改变。
早在我最初实习的公司里面,整个公司都在围绕着一款操作系统(Elastos)进行开发。测试对于整个系统的重要性不言而喻,任何小的修改都有可能导致整个系统跑不起来。当时的策略是,公司内有一个很大的测试部门会参与到测试用例的编写,除此之外,研发自己也会写很多的单元测试工具。由于Elastos项目开始的较早(2000),很多工具需要自己开发和集成。开发、测试、运维集合在一起,才能确保系统的正确性。
但在后面的很长一段时间,我所在的公司都在从事应用层面的开发。单元测试就不显得那么重要了,很多时候,功能能用就可以了。甚至在小一点的团队里面,测试是不需要的,研发会代替测试的工作。
对于敏捷开发而言,迭代频繁了,单元测试也显得更重要了,每一轮迭代需要确保以前做的功能是好的。另外,开发方式上也有变化。更多的是简化功能实现,不再设计很复杂的实现了,能满足现有的需求即可。
- 重构
上面的TDD其实是基于如下的开发方式的:
研发先按使用场景编写单元测试,然后再实现功能,最后跑单元测试,直到全部通过。在这个过程中会遇到一个常见的问题,代码在编写的过程中,会变的很乱。这个我在之前的开发中就有遇到过。解决这个问题的方法很简单,就是重构。反正有单元测试用例,重构的过程也变得很简单,而且不用担心会把功能改坏。从研发角度而言,问题会从代码层面转嫁到单元测试用例层面,即你需要完善用例,确保覆盖到尽可能多的可能性,从而保证代码的正确性。
对于重构,我是有研究的。在几年前,我就意识到写代码的层面,大致分四种:重构、设计模式、框架、软件架构(具体可以参见这里)。这四个层面实际上是用来应对需求的不确定性的程度,对于需求的稳定程序,给予不同的设计思路。
关于重构的另外一点是,它除了适用于自己写代码之外,还适用于对已有旧代码的维护。关于这一点,我以前没有深入的思考过,好在这一次有人总结了一些经验,作为书分享出来了(修改代码的艺术),我觉得这也是我对重构这一部分比较大的收获之一。
- 持续集成
持续集成这一块,看似属于运维层面,因为用到了一些运维的工具。但我认为,这一块仍然和研发有十分重要的关联。
如果一个团队二三十个人,开发一个框架,这个时候,持续集成的作用就很大了。它可以确保,单个成员修改的代码,不会影响到其它的功能。下面这张图很好的展示了持续集成的作用:
在我现在的公司,这一块是归运维团队管的。所以,基本上无法实施学到的东西。最多就是可以给运维团队一些建议。
最后要说的是CSD培训是CSM培训很好的补充,对研发有很大的启发性。实际上,在实施敏捷开发的过程中,好的实践总会慢慢涌现出来的。你所要做的就是,随时准备着,迎接能提升你效率的方式、方法。
SUI,自定义弹出框的内容
SUI中,使用$.promt()弹框并包含一个输入框的源码仅供参考。然后再用$.modal()来自定义对话框。
$.prompt = function (text, title, callbackOk, callbackCancel) { if (typeof title === 'function') { callbackCancel = arguments[2]; callbackOk = arguments[1]; title = undefined; } return $.modal({ text: text || '', title: typeof title === 'undefined' ? defaults.modalTitle : title, afterText: '<input type="text" class="modal-text-input">', buttons: [ { text: defaults.modalButtonCancel }, { text: defaults.modalButtonOk, bold: true } ], onClick: function (modal, index) { if (index === 0 && callbackCancel) callbackCancel($(modal).find('.modal-text-input').val()); if (index === 1 && callbackOk) callbackOk($(modal).find('.modal-text-input').val()); } }); };
关于Win2008计划任务运行Bat脚本
需要设置权限为Administrators组,且选择最高权限。具体参考这里:windows2008计划任务不能定时执行解决思路。
“二.创建任务 在图一界面点击右边的创建任务,打开创建任务对话框,输入任务名字,在图二中更改用户或组中,一定要选择administrators,在配置下面选择windows Servertm 2008R2,同时选择使用最高权限运行,点击确定后如图三。”
Batch Scripting Help
Open command line and input help.
C:\Program Files\Oracle\VirtualBox>help
有关某个命令的详细信息,请键入 HELP 命令名
ASSOC 显示或修改文件扩展名关联。
ATTRIB 显示或更改文件属性。
BREAK 设置或清除扩展式 CTRL+C 检查。
BCDEDIT 设置启动数据库中的属性以控制启动加载。
CACLS 显示或修改文件的访问控制列表(ACL)。
CALL 从另一个批处理程序调用这一个。
CD 显示当前目录的名称或将其更改。
CHCP 显示或设置活动代码页数。
CHDIR 显示当前目录的名称或将其更改。
CHKDSK 检查磁盘并显示状态报告。
CHKNTFS 显示或修改启动时间磁盘检查。
CLS 清除屏幕。
CMD 打开另一个 Windows 命令解释程序窗口。
COLOR 设置默认控制台前景和背景颜色。
COMP 比较两个或两套文件的内容。
COMPACT 显示或更改 NTFS 分区上文件的压缩。
CONVERT 将 FAT 卷转换成 NTFS。您不能转换
当前驱动器。
COPY 将至少一个文件复制到另一个位置。
DATE 显示或设置日期。
DEL 删除至少一个文件。
DIR 显示一个目录中的文件和子目录。
DISKCOMP 比较两个软盘的内容。
DISKCOPY 将一个软盘的内容复制到另一个软盘。
DISKPART 显示或配置磁盘分区属性。
DOSKEY 编辑命令行、调用 Windows 命令并创建宏。
DRIVERQUERY 显示当前设备驱动程序状态和属性。
ECHO 显示消息,或将命令回显打开或关上。
ENDLOCAL 结束批文件中环境更改的本地化。
ERASE 删除一个或多个文件。
EXIT 退出 CMD.EXE 程序(命令解释程序)。
FC 比较两个文件或两个文件集并显示它们之间的不同。
FIND 在一个或多个文件中搜索一个文本字符串。
FINDSTR 在多个文件中搜索字符串。
FOR 为一套文件中的每个文件运行一个指定的命令。
FORMAT 格式化磁盘,以便跟 Windows 使用。
FSUTIL 显示或配置文件系统的属性。
FTYPE 显示或修改用在文件扩展名关联的文件类型。
GOTO 将 Windows 命令解释程序指向批处理程序
中某个带标签的行。
GPRESULT 显示机器或用户的组策略信息。
GRAFTABL 启用 Windows 在图形模式显示扩展字符集。
HELP 提供 Windows 命令的帮助信息。
ICACLS 显示、修改、备份或还原文件和
目录的 ACL。
IF 在批处理程序中执行有条件的处理过程。
LABEL 创建、更改或删除磁盘的卷标。
MD 创建一个目录。
MKDIR 创建一个目录。
MKLINK 创建符号链接和硬链接
MODE 配置系统设备。
MORE 逐屏显示输出。
MOVE 将一个或多个文件从一个目录移动到另一个目录。
OPENFILES 显示远程用户为了文件共享而打开的文件。
PATH 为可执行文件显示或设置搜索路径。
PAUSE 停止批处理文件的处理并显示信息。
POPD 还原由 PUSHD 保存的当前目录上一次的值。
PRINT 打印一个文本文件。
PROMPT 改变 Windows 命令提示。
PUSHD 保存当前目录,然后对其进行更改。
RD 删除目录。
RECOVER 从损坏的磁盘中恢复可读取的信息。
REM 记录批处理文件或 CONFIG.SYS 中的注释。
REN 重新命名文件。
RENAME 重新命名文件。
REPLACE 替换文件。
RMDIR 删除目录。
ROBOCOPY 复制文件和目录树的高级实用程序
SET 显示、设置或删除 Windows 环境变量。
SETLOCAL 开始用批文件改变环境的本地化。
SC 显示或配置服务(后台处理)。
SCHTASKS 安排命令和程序在一部计算机上按计划运行。
SHIFT 调整批处理文件中可替换参数的位置。
SHUTDOWN 让机器在本地或远程正确关闭。
SORT 将输入排序。
START 打开单独视窗运行指定程序或命令。
SUBST 将驱动器号与路径关联。
SYSTEMINFO 显示机器的具体的属性和配置。
TASKLIST 显示包括服务的所有当前运行的任务。
TASKKILL 终止正在运行的进程或应用程序。
TIME 显示或设置系统时间。
TITLE 设置 CMD.EXE 会话的窗口标题。
TREE 以图形显示启动器或路径的目录结构。
TYPE 显示文本文件的内容。
VER 显示 Windows 的版本。
VERIFY 告诉 Windows 验证文件是否正确写入磁盘。
VOL 显示磁盘卷标和序列号。
XCOPY 复制文件和目录树。
WMIC 在交互命令外壳里显示 WMI 信息。
有关工具的详细信息,请参阅联机帮助中的命令行参考。
编码的四个阶段
作为一个程序员,离不开编码。随着时间的积累,编码能力会逐渐提升,本文试图探讨作为一个代码编写者,需要经历的四个阶段。
重构(Refactor)
重构这个代码编写技巧,源自于我早先看到的一本书《重构:改善既有代码的设计》。
重构的意思是说,代码是随着需求的增加,而不断变化的。比如,你写了个程序,输出了“Hello World”。你可能会用下面的语句:
print "Hello World"
但是如果增加需求,支持输出文本用不同的颜色展示。你可能会先封装一个函数来支持,然后用这个函数去输出“Hello World”。
def output_color_text(text, color): # ... output_color_text('Hello World', RED)
然后新的需求又来了,需要支持不同大小的文本。为了满足这个需求,你可能会先设计一个类,然后在封装一些成员函数,最后只要调用相关方法即可按需求输出文本“Hello World”。
class OutText: def __init__(text): # ... def set_size(size): # ... def set_color(color): # ... def output(): # ... text = OutText() text.set_size(24) text.set_color(RED) text.output('Hello World')
重构只能算是一种写代码的技巧,而且只是包含了一些基本的重构规则,无法形成一个比较完善的体系,因为重构和需求的变化有关,而且,需要程序员去思考代码改往哪个方向走。
设计模式(Design Pattern)
说到设计模式,肯定会想到这本书《计算机科学丛书:设计模式 可复用面向对象软件的基础》
这本书被称为经典,我看到的很多人都在看这本书。这本书里的23种设计模式,在我看来是远远不够的,因为我们看到,这里面的很多设计模式都和图形界面程序有关。而一些基本的设计模式,比如创建模式,则是为了弥补语言的不足。
语言(比如Python)通常被设计成通用的,而通用语言是可以被用在所有的场景里面。但是问题在于,我们更多的时候,是使用语言来满足特定的需求的。我们可能会用语言去写一个网站、一个数据库系统,那么在这种使用场景里面,你会发现通用语言用起来太麻烦了。所以有人就总结除了设计模式,其实也就是为了弥补语言在特定场景下的不足。
至于一些和特定使用场景相关的设计模式(比如装饰模式),则和语言的使用场景有关。语言的使用场景是无法枚举的,所以设计模式理论上应该有无限多个。
如果拿设计模式和重构来比较的话,设计模式只是满足了一个相对大一点的需求。比重构考虑的更远一点而已。
框架(Framework)
相对于前面两种技巧而言,框架能解决更大一点的需求。而且框架已经属于设计范畴,也就意味着,框架更稳定。
框架的例子,比如Python的Django,就是用来支持网站后端。除非访问量很大、并发很多,否则这个框架是一直可以胜任的。
相对而言,框架的设计和实现,需要更丰富的经验和技巧。而通常情况下,你不需要自己设计框架。
我感觉,这一块,主要是;重构+设计模式+业务需求。似乎,也没有什么可以指导的方法论。
软件架构(Software Architecture)
软件架构这块牵扯的东西太多,我经验也不多。推荐看这本书《架构即未来:现代企业可扩展的Web架构、流程和组织(原书第2版)》。
软件架构可能会考虑公司未来3-5年的需求,以及公司现有的资源,将来的发展状况等等,已经不是代码层面的问题了。但即使这样,也仍然可以找到一些基本的准则,用于指导软件架构工作。