最新文章
序列化和反序列化 编程基础
摘要 序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中;另一方面,它们会以其他更容易理解的概念出现,例如加密、持久化。然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式、大数据量系统设计...
尾调用优化 编程基础
尾调用(Tail Call)是函数式编程的一个重要概念,本文介绍它的含义和用法。 一、什么是尾调用? 尾调用的概念非常简单,一句话就能说清楚,就是指某个函数的最后一步是调用另一个函数。function f(x){ return g(x);} 上面代码中,函数f的最后一步是调用函数g,这...
淘宝搜索算法现状 互联网
淘宝搜索排序的目的是帮助用户快速的找到需要的商品。从技术上来说,就是在用户输入关键词匹配到的商品中,把最符合用户需求的商品排到第一位,其它的依次排在后续相应的位置。为了更好的实现这个目标,算法排序系统基本按三个方面来推进: 一、算法模型 当用户输入关键词进行搜索的时候,系统依据算法模型来给匹...
对象的职责 软件设计
对象和数据的主要差别就是对象有行为,行为可以看成责任职责(responsibilities以下简称职责)的一种,理解职责是实现好的OO设计的关键。“Understanding responsibilities is key to good object-oriented design”—Mart...
好对象的7大美德 编程基础
英文原文:Seven Virtues of a Good Object Marin Folwer 说过:“库本质上是一组可以调用的函数,这些函数现在经常被组织到类中。” 函数组织到类中?恕我冒昧,这个观点是错误的。而且这是对面向对象编程中类的非常普遍的误解。类不是函数的组织者,对象也不是数据...
iOS应用架构谈(一):架构设计的方法论 手机开发
缘由 之前安居客iOS app的第二版架构大部分内容是我做的,期间有总结了一些经验。在将近一年之后,前同事zzz在微信朋友圈上发了一个问题:假如问你一个iOS or Android app的架构,你会从哪些方面来说呢? 当时看到这个问题正好在乘公车回家的路上,闲来无聊就答了一把。在zzz在微...
在团队中如何带领新手 程序人生
目标 通过引导、任务分配和沟通反馈等方式,让他逐步适应团队正常工作面临的压力、节奏和不确定性。对于一些心理预期过高的领导者,在此阶段应该明白,对于一个新手,还暂时谈不上能力判断和机会给予。 方式 创造良好的工作气氛:信任是第一位的。只有相互信任,才能把工作放手交给新手去做;另一方面,在他们...
微博背后的那些算法 编程基础
引言 微博是一个很多人都在用的社交应用。天天刷微博的人每天都会进行着这样几个操作:原创、转发、回复、阅读、关注、@等。其中,前四个是针对短博文,最后的关注和@则针对的是用户之间的关系,关注某个人就意味着你成为他的粉丝,而他成为你的好友;@某个人意味着你想要他看到你的微博信息。 微博被人们认为...
谈“测试驱动的开发” 软件设计
现在的很多公司,包括 Google 和我现在的公司 Coverity,都喜欢一种“测试驱动的开发”(test-driven development)。它的原理是,在写程序的时候同时写上自动化的“单元测试”(unit test)。在代码修改之后,这些测试可以批量的被运行,这样就可以避免不应该出现的...
好团队不可能凭空出现,赢在Leader的可行规划 项目管理
《西游记》中的唐僧团队历经千难万险,终于求得真经,目标明确、分工合理为这支队伍最终走向成功奠定了基础。唐僧从一开始,就为这个团队设定了西天取经的目标,虽然经历各种挫折与磨难,但目标从未动摇。悟空探路、八戒牵马、沙僧挑担,几位徒弟一起肩负着保护唐僧的任务。虽然性格迥异、各有缺点,但目标分解合理及成...
移动应用测试——打造完美应用的秘诀 软件测试
英文原文:Mobile App Testing - The Secret to the Perfect App 打造完美移动应用的关键 上个季度,你刚刚花了大半个季度的时间,开发最新版本的移动应用程序。这是一项必须完成的工作。最近的主流移动操作系统升级让你的应用具备了新的能力。你的竞争对手已...
什么是对象,为什么要面向对象,怎么才能面向对象? 软件设计
一、 面向对象,这个对象到底是什么? 这个对象不是C#中的实例,C#中我们把一个类的实例也叫做对象,这种对象严格的说应该是面向对象的编程实现(OOP)中的对象,面向对象编程,也不是面向类的实例编程。对象的定义是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体...
驱动方法不能改变任何事情 软件设计
原文链接:*-Driven* do not change anything 你曾听说过一名专业软件开发人员应该掌握一种驱动方法吗?这些驱动方法可能是:领域驱动设计(Domain-Driven Design)、测试驱动开发(Test-Driven Development)、行为驱动开发(Beha...
推行TDD的思考 软件设计
目前来看,推行TDD的障碍大约有如下几点:1. 开发人员的质量意识;2. 分析需求并进行任务分解的能力;3. 将测试作为开发起点的开发习惯;4. 开发人员的重构能力,包括如何识别坏味道和如何运用重构手法;5. 单元测试的基础设施,尤其是测试数据准备; 开发人员的质量意识 开发人员对于软件质量...
首席工程师揭秘:LinkedIn大数据后台是如何运作的 互联网
英文原文:The Log: What every software engineer should know about real-time data's unifying abstraction 我在六年前的一个令人兴奋的时刻加入到LinkedIn公司。从那个时候开始我们就破解单一的、集中式...
码农的思维训练:超越专家 程序人生
真正的发现之旅不在于追求新大陆,而在于拥有新的视野。——马塞尔•普鲁斯特(Marcel Proust,1871.7.10—1922.11.18),法国20世纪最伟大的小说家,意识流小说的先驱与大师 那么,现在该怎么做? 有效的改变 当你决心改变时,大脑并不是一定会与我们合作。虽然你有学习的意愿...
如何摆脱令人头疼的架构依赖? 软件设计
英文原文:The Elusive Dependency 我猜你一定了解以下这种感觉:你马上要准备在某个项目审查会议中发言,而你已知道自己陷入了麻烦中。看看这个仅有5页的幻灯片,你深切地感觉到这个会议注定不会进行得很顺利。即使经过连续三个晚上的通宵奋战,将原本16页的演讲精简为4页的模板,你也无...
老码农的技术理想 程序人生
小时候,老师问我,你的理想是什么?我不假思索说是工程师,于是长大之后果然成了工程师。 工作这么多年,一直在思考工程师这三个字的意义,终于有一天恍然大悟,原来就是:用技术手段改进世界。 那么,在软件方面,目前的世界有哪些问题需要解决呢?有这么一些问题可以思考:现在整个世界的信息化程度是偏高还是...
我们为什么要思考算法 互联网
源头 “算法”的中文最早出现在中国汉代的数学名著《周髀算经》中。《周髀算经》卷上有:“数之法出于圆方。圆出于方,方出于矩。矩出于九九八十一”。意思是: 算数的方法都出于对圆、对方的计算,其中圆出于方(圆形面积=外接正方形x圆周率/4),方出于矩(正方形源自两边相等的矩),矩的计算出于九九八十一...
事件流如何提高应用程序的扩展性、可靠性和可维护性 软件设计
关于事件流处理,在不同的场景中有不同的概念。有人称之为流处理,有人称之为事件溯源或CQRS,还有人称之为“复杂事件处理(Complex Event Processing)”。不管名称是什么,它们的基本原则都是一样的。Martin Kleppmann是Apache Samza的贡献者。在本文中,我...