写代码的那些事3

1.  定义标志变量. 发现这个变量有歧义的时候,果断重新定义一个新的. 而不是把它从 bool 改成 int  名字不改,  否则会让你很困惑.

真想改成 Int 那就把名字也改了.   jumpState  好过   jump   . 原则就是减少歧义,保持纯洁性. 统一性. 减少修改后对有依赖的旧代码产生bug .

2. 结构设计其实是从需求开始的.  比如你不想写4-5行几乎一模一样的代码 来初始化一个 UI . 于是你把这些变成一个UI组件. 只是略微修改不一样的部分.

其实实际项目中,结构不是一下子就成了这个样子的, 是不断完善出来的. 原则就是:  提高代码复用, 但又要保持不被滥用. 函数只完成预定功能. 更复杂的部分, 要么是变成新函数,要么是先用琐碎代码实现功能.

过几天,有类似需求之后 再整理变成可复用代码(函数) .   做到最小单位 逻辑耦合.  如果想完成功能,还非要去查N个API组合起来才能实现, 这就是代码厚重的表现. 友方代码没有做好接口化.

变成组件好处就是可以提高代码的控制力. 用循环就可以实现修改, 用循环减少重复代码.  即便是差异非常大, 也没关系, 日后有类似扩张的时候, 你就体会到结构化的便利了.  一堆代码是没办法控制的. 变成class /ojbect  就可以能了.

3. 做UI就不用考虑知道原始的数据结构. 只是按数据把Ui刷新就好了.  数据解析原本应该就是额外的模块来处理.   而这个模块专心做数据处理.  没有的话, 就是需要写一个. 硬要把取数据 解析数据琐碎的事 也扔给UI程序实在是不合理.只有分工足够模块化, 才是最终代码结构化的保证.

4. 该异步的就得异步,  刷新时去取数据 会占用CPU 甚至阻塞主线程. 其实是可以异步的, 数据获取走一个, UI刷新走一个. 没有变更数据, UI不会重绘.  写什么样的代码还是得看能用什么样的方式来完成功能. 有时候你用线程是不行的, 就得异步.

epoll 啥的也没那么神秘.

5. bug这事要理性看待, 出bug是常态, 别上纲上线. 要分析出现的原因, 客观的评价一个人的工作质量.   在策划啥都没有的情况下, 写出来的代码只是原型化而已,  出什么状况都属正常.   要是没bug 那才是奇怪了呢.

等上线以后,你就哭去吧.

Read More

Open Source or Developer Friendly . you are the world.

开源,还是开源, 最近接触和使用的都是开源的技术. 越发的体会到巨大的价值. 如果非要说的邪恶一点, 那就是在人生路口选择上船. 即便是免费船票, 也可以有豪华邮轮. 无非是后期还贷. 但当你已经具备还贷能力的话, 这一些就不算什么了.

这就是开源的一种驱动模式. 对开发者投资. Developer friendly.

有很多项目即使是闭源的, 但也保持了 Developer friendly.  比如 NewRelic 的免费T恤. 只有真正的开发者才可能参与的活动. 过滤掉了一群无关Greek 人肉党.

开源的第二个模式是, 培养用户的习惯. 结果是会造成用户学习其它技术的曲线会无形中变高 , 然后随着年龄增大, 越发的会沉浸在使用的快乐中. 占领开发者, 让开发者为自己的平台做产品,做应用.  反正缺的就是精品, 也不怕市场变成汪洋大海.

开源其实是天生Developer  friendly 的. 因为是程序员开发的, 多少都会对同类心存善念.   当你越过了开源这道坎, 你就真的成熟了, 因为你看到了产品和技术的差异, 以及之间的技术鸿沟.  归根到底, 开源可以星星之火来燎原, 毕竟一家独秀 也不见得用户买单. 思维枯竭, 不可跨越的瓶颈, 都会成为潜在的杀手, 扼杀着每个团队.  我想制作了一款成功游戏, 然后就一蹶不振的例子也不少了.  而啥没有一鼓作气呢?   我觉得就是遇到了不可跨越的瓶颈.

Marmalade 这个引擎, 推出了一个活动, 提交一款BlackBerry10应用并上线, 就可以免费使用1年. 这个case 是个很好的 Developer friendly 的, $499 其实是虚的不存在的.  Marmalade 没花一分钱, BlackBerry 也没有. 只有开发者花了很多时间成本.  然后获得了一年授权,和免费的BlackBerry帐号.   当然还有销售赚钱的美好前景. 收益最大的还是前两家.

所以现在看看 苹果提供的 3/7分成方式是不是有点邪恶呢.  他不光赚设备钱 还得赚开发者未来的钱.  每年还99$这种小钱都不放过. 也许这就是强势最好的诠释. 而且的确阻止了很多人前进的步伐. 剩下的都是弥笃的坚定者. 产品自然也更可能是棒的.  生态圈的口碑好,赚钱也就更容易. 花得值是用户是否花钱的一个理由.  所以, 苹果不是邪恶的, 在试图维系生态圈的良性发展. 用经济杠杆.   也许某一天 $99  可以赊账, 代价肯定是利息会更高. 那时候,你就会毫不犹豫的选择$99了.

我相信闭源项目也都有一颗开源的心. 可能是出于维护成本和保持项目的简洁等等.  所以我又想起我以前设想的深度开源的模式. 即有限范围内的开源. 比如针对已有产品的团队 等等. 交换和交流结合. 大家好,才是真的好.

Read More

杂谈,云时代,重点是节省时间成本,必须让机器去干活.

所以云时代的价值,不光是 @Tinyfool 说的南北互通问题, 我倒觉得 云计算以及跑着代码干活的代码机器人更有价值,  这都是大大节约时间的, 最多被提及的是爬虫.采集.听起来有些黑帽.  先不要不懈,耐心听我分析一下.

引子: “Beautiful Soup是用来节省程序员的时间,而不是处理器的时间。这充分体现了程序员的价值, 不是机械的去敲各种命令 重复性的操作.  机械的每天重复的点击Feedly 查看 RSS 可能真的不是一件什么有趣的事.  因为要忍受数据加载的速度, 还得折腾翻墙啥的.

云时代, 我们造一个学习机器人(代码支撑), 让它在云里跑, 然后Push给我们我们想要的. 按我们自己一样的思维和选择方式.  甚至于, 都可以让网站在大众面前消失. 就都在私有云里面就好了, 还省得去考虑什么南北互通的问题了.

当然了,我说的这种场景只是一种. 不会是所有的web应用都是适用的.(写到这里 我怎么觉得我再重复一个很熟悉的动作呢,就像做过这件事(写过这个blog) 一样)

现在云貌似大多和主机扯在一起, 可以提高访问速度啥的.  更高级的形式应该还在后面. 当然了, 这些也是离不开基础建设的. 昨天才知道 连 京东 美团 都搞云…  有点大大的意外.

延伸一下, 该机器干的活, 就让机器干, 别折腾人了.   某个网盘的验证码真是太变态了. 看都看不出来 怎么输呢, 一刷新就是弹广告, 真是服了.   莫非这就是运营的策略, 折腾你没商量, 只有花钱才能爽. 不然,满清十大酷刑都给你上, 你还得忍着?

换一家? 结果发现乌鸦一般黑… 还真没有恶意竞争, 白给你一块肉的.

试问, 如果有这个机器人, 你只要留一个邮件, 或者是一个ftp 乃至一个 web url  然后你就可以每天节省很多浏览无用信息和筛选的时间,  还能得到信息, 是不是你愿意花点钱呢?

这个其实 @Tinyfool 已经做了一个 tiny4cocoa 的Rss 知识学习的. 自动整理的都是高质量的 ios mac 相关的知识信息.   这就是程序员的思维, 能用代码干的绝不用人. 和煤矿老板完全不是一个思路.  煤可以挖完了, 代码却可以永生.

但大众估计不会这么想, 还是很享受的每天在牛皮癣 创可贴的一大堆广告里 看文字. 还都是最无用的: 美国打日本了 日本发现解放军了  某某威武了 诸如此类. 风马牛不相及而且极其无用的信息, 时间也被浪费了. 莫非这就是娱乐?    如果从大众用户需求出发, 貌似他们还真不需要这么高级的玩意. 但也别忘了,大众也不喜欢付费.

大了说, 云时代给了我们很多遐想的空间. 可以创造出很多新的模式.  我相信, 程序代码终将改变时代.

也有人的喜欢说大数据时代. 其实应该是云的一个应用场景. 我理解也是这种场景催生了云时代的到来.  亚马逊自己觉得好用,然后才推广之.  适时改变思维了, 作为程序,只要找到合适的点, 会创造更大的人生价值.   以往你想找个大质数, 找个DNA序列要跑多久?  换到云里没准就是几秒钟的事.  没准暴力破解个rar密码都是可能的.  aws的租用模式这时候就很合理了, cpu 计算了就收费. 但是无限cpu 给你用啊.  这换作以前 完全不可能.

小了说, 此时不抓住云机会, 更待何时. 开动脑筋, 写出你人生!

网赚必须要依靠程序化 自动化 人肉是可耻的!

Read More

2013首先你需要的是VPS

所谓工欲善其事 必先利其器. 所以最近2个月我分享了一些可以加速大家获取信息的通道. 而不仅仅是停留在依赖于各种很容易被xx的工具. 而是要保持稳定的方式, 其实这就是我所提到VPS的原因.真的真的很想说,每个科技工作者可能都需要一个VPS. 因为VPS=VPN = BLOG = WEBSITE = $ 都是有可能的. 所以2013年, 务必整一个VPS. 不会linux没关系, 我可以帮你. 欢迎骚扰.
偶可以负责任的告诉你: Debian32bit OS 256M的 VPS可以配置VPN. 装WP博客.

看到周围很多的同事只能在baidu里面爬来爬去,实在是无奈. 我想这也代表了一种现状. 信息会更加的不对称下去.

如果不想劳什子管理VPS,那就试试诸多VPN吧.免费临时用的也有很多, 这里不一一列举了. 可以移步 http://www.chenlong.me/freevpn/ 获得. 这中资源很容易屏蔽.消失.. 所以只能私下用. 同时因为共享IP的缘故,能做的事有限,只能浏览网页了. 高级点的比如 购买域名,注册域名都有被视作欺诈的可能. 很麻烦. 所以如果你有以上的需求, 我建议你还是整个VPS吧.

今天在回家的地铁上,我又浮现除了上学时的一幕, 那时候俺 能在机房上教育网,但是无法访问chinanet的, 于是研究了一阵子 发现了proxy这玩意. 还整过第一个个人主页. 我记得是湖北热线的. 现在早没了.. 还有一个著名的叫做 蚂蚁和猎手的收藏馆. 再后来写代理猎手的作者好像去了米国… 时至今日, 我仿佛又回到了过去, 仍然需要费劲脑汁的解决 上网的问题.. 唉.

顺便也做个小广告: 如果你正好想买VPS ,不妨看看我的推荐. 说是推荐, 偶推荐并不是因为他们都很完美, 有的是价低适合新手练习, 有的是比较稳定. 总之一句话: 主机有风险,入手需谨慎.

题外话, 普通的代理服务器这个技术 估计已经过时了. 至少用于翻墙是没戏了. 现在还能活着的是 SSH 基于SSL加密的方式的.

我这给你几个暗示: ssh client tunnel bitvise 你懂的.

Read More

深度share模式的开源的方案设想

昨日回顾这几年, 感慨很多, 因为23日 FIT 的作者 西去了. 而2012年听到太多的有关于 衰老死 的事.  而回顾自己, 貌似也是走在这边缘徘徊, 因为自5月份到今天, 我大多数情况下, 每天夜晚会坚持到2点偶尔还有到凌晨4点的时候,  多出的时间, 80%被用在webgame的研发上, 20%的时间用来想以后的事.  准确的说, 我又闭门造车了,而且几乎是从零开始. 也是为了结合现有的资源,客户端选择了Flash, 接下来的事谁也没想到, 印证了葛优那句话: 我本将心向明月,奈何明月照沟渠. 到7月的时候, 基本上服务器端的底层完成了, 我的解决方案是;  python + bigworld + protobuff . 写了一层作为flash到bigworld的连接. 后来我也看到貌似官方Bigworld也有这个趋势, 但还没看到实质性的东西.  说个题外话, bigworld 这个引擎 网络部分还是很强的, 但也有一点也很致命,   因为没有源码, 一但出现什么bug  他们的支持很拖沓, 很坑爹.     原本计划是, 复用sko的script ,但是到8月时出了问题, 新 sko没有如期的完成, 而webgame的时间又被压缩了, 只好放弃webrpg的想法, 重选了一个相对能快速一点的休闲类游戏. 这里先卖个关子, 等再过1个月左右, 应该就能在线测试了.  简单的说, 项目的目标调整了以后, 好在服务器的工作没有浪费. 继续做到9月份大致就有个摸样了…  但游戏还需要很多细化和修bug.  各种交织,很悲剧.  只有两个人.  意外的事就发生了, 10月做客户端的同学离职了.   接下来的时间, 我只好又深深的挖了个更大的坑, 我又开始熟悉 as 脚本.  实际上逻辑部分倒不是担心的, 出现的大多问题还是与flash 平台有关的. 不熟悉啊..  断断续续的修了一些明显的bug.    目前的状况是, 重写了客户端, 我的考虑是既然要不断地修bug 还不如写一个更符合自己思路的, 要再修bug也省力一些.  所以, 就有了这一版的单机游戏.  在这里,我也算标记一下. 目标是下个月底发布, 看看能否兑现.

说了这么多铺垫, 更想说的是对于share模式的开源的设想,  大致是这样,  在这个组织里, 每个功能模块由不同的人贡献 .
而要想获得实际的使用权限, 我指的是产品发布, 需要付费, 没错, 每个模块都要付费.   模块的作者可以设定对于某些深度合作的人免费或者打折.   这样可以把程序的工作最大限度的共享,  试想, 一年又一年, 有多少人在同一天都在做着同样的重复劳动, 要造车. 浪费多少个青春和岁月啊.

现在不是云时代吗,  如果一群人不希望100% open source, 那可以考虑我说的私有形式的开源.  组织内部是开源的.  是的, 其实已经有游戏引擎了, 各种开发框架. 但还是有重复造车的事在发生,  所以我觉得程序这个行业需要open .   对于是否有必要, 你只要问自己如下几个问题,  1. 你想一直以一当十? 没有团队 你能做多大的事?   2. 你是万能的吗, 有新需求时,每次都自己解决? 3. google 是万能的吗, 不是什么都能google到的,对吧.

试想, 原本可以做1件事的5个人 揉在一起, 可以做更多的事.  是不是很好.  每个模块还需要若干个备份的维护者倒是真的, 不然有人西去了, 模块就没人维护了不是.

这个 组织必须是封闭的, 不会在google的搜索结果中出现. 当然也可以适当出现一些,  即对于组织外的人的使用问题, 就是必须付费或者分成.  前提是足够强大,可以支撑和实现各种功能.   我相信这种模式是适合真正的程序作为职业生存的.  因为可以专业, 可以持续性, 也可以刚好更快。

哈, 对于组织外的人, 它很像现在的引擎.  但是这个是多人维护的,  用户或者内部的人会依据需求提新需求. 比如写个shader . 做个新的美术表现.  (Unity3d 的 store 模式很像噢)

同时, 这种模式的开源其实是提供了一种可能, 那就是拥有开发能力的这些人之间的技术分享, 我相信足够牛的人只要给时间, 的确是无所不能的, 但挖了坑,得有人埋吧, 你怎么可能自己把自己埋了呢.  同一时间, 你只能做一件事.  然后, 你有一个机会, 可以不断地轻松的工作,  节省下里的时间就可以用来陪孩子,去旅游. 是不是很惬意.

open source 不是google到代码,一字不差。如果有一天,有这种组织形式诞生了, 没有google。我相信世界会更美好.  干货. 全都是干货//

从产品的层次看, 项目的成与败, 可不单单是拼的技术. 拼的是团队啊..  公司机器这种组织形式是最邪恶的,  就像足球联赛, 最佳组合必然是联合国才行, 世界杯就不允许自由组合..

Read More

原来这就是番茄的由来. 番茄工作法 :)

番茄工作法的做法

1.每天开始的时候规划今天要完成的几项任务,将任务逐项写在列表里(或记在软件的清单里)

2.设定你的番茄钟(定时器、软件、闹钟等),时间是25分钟。

3.开始完成第一项任务,直到番茄钟响铃或提醒(25分钟到)。

4.停止工作,并在列表里该项任务后画个X。

5.休息3~5分钟,活动、喝水、方便等等。

6.开始下一个番茄钟,继续该任务。一直循环下去,直到完成该任务,并在列表里将该任务划掉。

7.每四个番茄钟后,休息25分钟。

在某个番茄钟的过程里,如果突然想起要做什么事情——

a.非得马上做不可的话,停止这个番茄钟并宣告它作废(哪怕还剩5分钟就结束了),去完成这件事情,之后再重新开始同一个番茄钟;

b.不是必须马上去做的话,在列表里该项任务后面标记一个逗号(表示打扰),并将这件事记在另一个列表里(比如叫“计划外事件”),然后接着完成这个番茄钟。

作为公司的创始人需要管理员工……你认为多久召开一次四小时不间断的会议?没有会议,没有Skype呼叫,没有迫切的电子邮件,没有服务器崩溃,没人问问题吗?

倘若真如此,那么你就是幸运的。

Read More

聆听自己的声音.

回顾一天所做的事. 列表.

回顾目前的任务的清单.

把事情变得有趣. 选择有趣的目标点

把自己藏起来, 别人找不到.

饿了, 就吃饭

困了,就睡觉

睡觉,吃饭,坐车,上厕所, 打开公司电脑写程序. 关闭电脑 回家.

不要看压抑的费力的视频或电影.

和一个心情好点人聊几句天.

任务一再拖后, 一再蹦出新任务,  任务列表必然会一直添加.  不要太担心, 只要按天 按周制定目标.

按优先等级 排序, 某阶段只能是 60%实现. 所以不要追求100%   但要预留接口 以及构想一下扩展的步骤.

别纠结, 别沉迷于某个技术点,  因为当天的目标不是它.

Read More

试做一个可组合的Monster

class A:
    def __init__(self,obj):
        self.obj = obj

    def think(self,*args):
        print ‘Think A’
        self.obj.display(self.obj,None)

    def setObj(self,p):
        self.obj = p

class B(A):
    def think(self,*args):
        A.think(self,*args)
        print ‘Think B’
       
class X:
    def display(self,*args):
        print "Display X"

class Y:
    def display(self,*args):
        print "Display Y"

Behaviors ={"M1":A,"M2":B}
Visuals ={"V1":X,"V2":Y}

class Monster:
    def __init__(self,visual,behavior):
        self.Visual = Visuals[visual]()
        self.Behavior = Behaviors[behavior](self)
        pass

    def think(self,*args):
        return self.Behavior.think(self,args)
   
    def display(self,*args):
        return self.Visual.display(self,args)

MA = Monster("V1","M1")
MB = Monster("V2","M2")
MC = Monster("V1","M2")
MD = Monster("V2","M1")
MA.think()
MB.think()
MC.think()
MD.think()

想必看官能明白这样做的好处吧.  

Read More

盐打哪咸 醋打哪酸

《玉观音》《死神傻了》以及《关人七事》 似乎都想讲述一种因果关系, 甚至是纯粹的巧合。后两个都运用了一种思路,就是善恶都在一念之间。所以最后只用了2分钟就演绎了另外一种好的结局。 《意外》其实也在套用这种思路, 只不过最后谜底揭开时,一切已经无法挽回。 玉观音则以一种近乎涅槃的方式演绎了复杂的故事, 虽然看着可爱的孩子频频出现在镜头中, 但已经隐约觉得最终会死去。果然… 或许只有这种残酷的方式才能隐射现实。说是因果关系, 实则是人之常事。有杀父母之仇,自然会报, 没想到的是杀死的是自己的骨肉。而这一切是因为一段不该发生的情愫。

 最近公司在招聘新人, 自己也时常反省, 也略有心得。一念之间或许真的会改变一个人的人生轨迹。所以如果你是招聘的面试官一定要明确, 招聘是要筛选符合条件的人,面试的问题不是为了难倒面试者, 而是要能缓解面试者的紧张, 以便可以循序渐进的了解更多面试者的能力,处事方式,以及其他。而面试者也不用太在意个别问题的正确与否,因为问题或许并不是关键 而透过问题获取的信息才是最关键的。 总之, 面试者一定要尽量展现自己全部的能力, 无论是专业技能还是态度还是其他。任何一个公司也不会拒绝一个上进 好学 基础扎实 又颇具天分的人。 所以如果一次面试不成功,不要紧,可以抓紧时间来弥补一些欠缺的知识, 主动展示你所写的一些作品会为了赢得一些机会。回想起当年,也的确是破费周折,  所以也希望能给一个面试者更多的机会。
通常一个有自己的blog的人,会得到加分。有分享精神的人其实不多, 但从个人角度讲也需要自己的反省和总结。
有自己完整作品的人会得到加分。这意味着一个人的独立解决问题的能力。
一个主动索取和主动分享的人会得到加分。具有协作精神。

– 有时候 需要的是努力。而不是抱怨和主动放弃, 可能一个旧的组织很难会决策开启一个新的篇章, 而越发的陈旧。改造和保持一个良性成长的组织也是一个挑战。 简单的说,面试官的倾向性意味着一个组织新成员的类型。慎重啊, 不可乱点鸳鸯。

 

Read More

知识是洪水

知识是洪水.

今天你看完,  明天还有新的。

今天看完了 是对的, 明天又改了,成错的了,白看了。

还得  嗷一下。

小时候还真梦想当个科学家, 也知道要做实验才能发现新技术, 可上了大学就搞不懂, 为什么老师只会念课本, 天天教, 却不会做开发。也许搞的都是理论吧.. 太多理论不就是花架子了吗.

最近在看Unity3d, 总结起来, 大部分时间花在google上. 不如踏踏实实的看文档.

如果一知半解的就动手实验,遇到的问题也会莫名其妙。

 

Read More