博客

设计的联想

由软件开发设计中,联想到设计一些好的产品。其实php也是支持动态编程的,就是说可以由函数和类都可以放到变量里面去。ruby调用方法用send,取得类用Object.const_get(var),并可依些进行实例化。这可以作为架构上设计使用。符合开放封闭的原则,按一定的模式去调用,功能的增加,只需要增加类就可以了,只要给出类名,直接调用就可以了。这就是动态语言的好处,可以在使用时,再生成程序代码,而那些类可以作为数据文件存放,只需要在使用时加载就可以了。这样,对程序功能的扩展是无限的,但并不会影响效能。

自动跟手动结合是做最好的产品的必需方式。最好的产品以及做一些做得最好,只能是人工的行为,人的思维是世界是最美的花朵。但人的控制与认识能力是有限的,从用木棒开始,人必须依靠工具才能拥有更大的创造力。工具是做一些事的前提条件,也让人类从烦杂的事中解决出来,让人拥有更强的认识与控制能力。这是人与人之间生产力最本质的差别。

向某初创公司投简历有感

目前中国互联网的大部分企业都是很目光短浅的,招的都是,必须要深刻理解某一方的技术细节,而且是马上可以干活那种,这就是最原始的压炸动机。一般的学习,肯定是学某一方面通用的技术,在实际遇到问题时,再去深入。只学一项技术是可以专得很深,但是风险是很大的,个人很难有独立性可言,一旦遇到风险,就完了。

现在就是大多都不愿意给机会让人成长,大多都只是想找到可以马上干活的,干完了,就踢掉。整个大环境就是很浮躁。公司要招到可以干活的人,是无可厚非,但只想捡到资源,就可以马上拼。未考虑人的资源,不同于物的资源,人的资源是需要成长的,需要时间与空间才能得到成长。大多小公司就只懂得快,而不懂得人的资源是怎么来的,它不同于物的资源。招聘,不仅仅是考查应骋者,更是对面试官的价值与能力的检验。大多只是想要技术细节方面有很细的认识,可以马上实现自己想法的人,这会错过很多人,也招不到合适的人,这是目光短浅的招聘。招聘把技术细节作为主要的考核,我想那那家的公司的成长性就很有限。这里面可以折射出内部架构的不合理,业务的不成熟,开发人员没有提意见的权重。

创业成功 = 人+时势
*只有时势,没有有能力的人(不仅仅是技术,更多是情商),做不成;
*人也不仅仅leader,而是全体创造性想法的总和;

Map & Reduce  与 消息队列形式的分发

Map & Reduce  是一种计算的模形
RabbitMQ是分配任务的的实现。

使用的方式是现实的问题,用map & reduce的计算模型去实现。写好怎么分配任务,怎么折分,写好map的函数,通过队列把任务分到很多map进程,写好reduce函数,把map的计算结果,折分出来,放到队列,队列再投放到reduce进程。这样方式,可以通过增加机器增加计算量,某种程度上对某些任务的分布式计算。

这里面实现的很多细节都是需要自己去定义的。

这样就可以专注于功能的开发,对计算量大的,可以以服务的形式独立出去。再写成分布式计算。

这是对架构具有关键性的一步,如果没有它,就意味着架构没法成长。后面,流量大了,可以增加机器很简单就可以解决问题。至此,再也不用担心架构超级大型的系统了,就是说,随着流量的增加,我的系统是可能过增加机器来增加算力,而且可以接近无法的扩展。

用rabbitMQ的一个很大好处,可以不局限用一种语言,我可以用任何语言来实现复杂的服务,但是还是具有可扩展性的,因为只要增加机器就可以进行扩展了,完全可以用原来的代码。

可以做出很复杂的应用,当一些服务很稳定,流量很大时,就可以独立开来,用分布式计算来实现。

设计时,以计算适应需求的变化

很是喜欢php里面的多维数组,可以用多维数组模拟现实的一切,从而可以进行计算。

数组是就是哈希表,哈希算法是很强大的东西,是对现实大量数据可以计算的关键算法,它的效率是很高的。

不仅仅是一个数组,一个数组里面的值可以作为另一个数组里面的键。元与值,可以根据应用,去描述与计算一切。

数据库里面的in操作也是哈希算法的,它的效率很高,而且效能也是表容的加和,而不是乘积。这是设计表时,考虑的一个方向

数据库in没法取得in表里面的字段,但是可以通过全部查出来作为数组,并通过关联的主键map到一块,这样处理的效能是很高的,而且对内容是很是具有可扩展性。

这是数组存储的多个维度,以适扩展的需要,完全可以用content type去扩展表,至于优化性能查询是很简单的事,在数据库层面存储多个维度,可以在php的计算层面很简单地缩减为一个维度。这是解决性能与扩展性矛盾的一个关键。

在drupal查询时,内容类型子表以node中的vid为主键。上百万的数据可以在秒内的时间完成。所以动态计算以适应需求完全是行得通的。

git与svn结合使用,遇到冲突怎么办

1. 新建一个工作分支,在工作分支上干活

master分支,主要用于代码的提交和更新。
如果在master上工作,就不会更新代码了,这是不能接受的。

2.在工作分支上做好功能开发或bug修补
git checkout -b [branch name]

3. 代码改好后,合并到master分支
git merge [branch name]

4.修订提交纪录里面的log message
git rebase -i HEAD~2
将最后两个提交合成一个提交

假设要合并最后的2个提交,可以按如下命令进行:

1). git rebase –i HEAD~2
2). 将第二个pick修改为squash或者s,然后输入":wq”退出。
3). 这时git会自动第二个提交合并到第一个中去。并提示输入新的message(就是我们常说的comments),如下:
4). 编辑输入新的message,然后输入":wq"退出
5). 此时本地的(HEAD中)最后两次提交已经被合并为一个。git log可以查看。

计算机位的操作

位运算组合起来,可以对存储在计算机中的各位进行自由操作。
计算机中处理的各种数据都是以二进制的位来表示的。文本是由字符所对应编码的数字串组成,各数字串最后还是还原成二进制的比特。图像数据是各个点的颜色按一定形式排列,最后也还是二进制的比特串。程序所处理的对象,甚至计算机所执行的程序本身,说到底都是二进制的比特串。
也就是说,操作二进制位就等于操作计算机的数据。

基本的位处理操作有 4 种。
1. 取出特定位的状态。
2. 特定位置位(设为 1)。
3. 特定位清零(设为 0)。
4. 特定位反转。

1 特定位的状态
要从一连串二进制位中取出某一特定位 a 的状态当然,这个功能可以用按位与(&)来实现。按位与的两方之中,只要有一方是 0,结果就必然是 0;一方是 1,另一方的结果就原封不动返回。所以准备一个数 B,只需将想取出的那一位置设为 1,其余位置设为 0,那么取 A 与 B 的按位与,就可以只取出 A 数中 a 位的状态。
A &= (1<<3)

drupal service的基本使用| 一个php写的客户端

  1. 下载,并启用 drush dl services drush en services

  2. 新建一个端点 关键是端点名,端点协议,还有端点的drupal内部路径(绝对路径作为客户端的url)

  3. 选择开放的资源

  4. 客户端注意,先连接,再发送用户名和密码过支登陆,取得登陆后的cookie后,再拿这个cookie去请求token, 取得的token是跟当前的认证会话是绑定在一起的。

  5. 带上cooke and token, 就可以进行写操作了。

github上地址

代码可视化工具+项目管理工具+项目文档工具

代码管理及可视化工具: git, gitlab or gitweb or fisheye or github or bitbucket
目的:
* 代码持续发布 --自动化布署
* 代码审查和评注  --质量审核与分工合作
* 通过代码交流 --备份代码,增强交流

项目管理工具: redmine or jira or basecamp
工作流中各个小任务的生命周期,放在网站上,以实现任务的分配/管理/交流
通过任务流的流程来实现项目的开发与维护。
* 谁都可以创建ticket, 只有项目经理可以approve ticket;
* ticket有各种状态,还有委派人和报告人,
* 可以根据工作状态,改变ticket的委派人和报告人,
* 对工作时间进行登记,
* 实时的消息通知
最关键的几种状态: backup list -> todo list -> process list -> test list -> ready for live -> deploy to live
还有根据项目的短中长计划,可以分成好几个面板,如spring, kanban。

页面