
软件开发
文章平均质量分 92
Thoughtworks思特沃克中国
这个作者很懒,什么都没留下…
展开
-
FizzBuzz与写代码的“一万”个细节
摘要:技术是由一万个细节组成的,哪怕一个这么简单的题目,也有如此多的点。我也不敢说自己是什么高手,起码写了许多年代码,也就把自己写代码的思维展示给大家,希望对有心人有所帮助。非初学者向,虽然题是个简单的题,但要求读者有一定的敏捷工程实践及DDD相关经验。FizzBuzz是一个经典的TDD入门题目,麻雀虽小,五脏……勉强算全吧。Stack Overflow创始人曾经在他的一本书里写到,“不要假设程序员都会写程序,招一个程序员来先写个FizzBuzz看看,结果可能会令你吃惊。”我当时不信,于是在一个.原创 2020-06-24 10:08:46 · 810 阅读 · 0 评论 -
条件型业务规则的抽象与实现——从Spring Profile得到的灵感
摘要当我们更倾向于使用具体的场景沟通的时候,团队更不容易意识到需要从中寻找稳定的抽象。那么我们需要花费精力去改变用户的思维方式吗,如果需要又应该使用什么样的方式?又或者我们需要使用更抽象的方式来撰写用户故事吗?最近,有幸参与了一个平台型的项目,该平台支持多种类型的产品预订,并且对于不同的产品类型,支持不同的预订规则。开发团队想尽可能地将主流程实现得更通用,以便在将来更快速地支持新的产品类型...原创 2020-04-29 14:38:03 · 389 阅读 · 0 评论 -
Hacking,约不约!
对于hacker来说,最有趣的事情莫过于破坏软件设计者的原有规则,重新建立属于自己的规则了。姑且不论这个行为是否合法或违规,单就技术本身而言,矛与盾、攻与防、破坏与重建的过程中,为了达到最终目的而衍生出来的奇妙技术,再配上天马行空的想像和创造足以 让人着迷不已。开篇尽管Linux内核开源,升级或替换内核十分方便,但仍有一些特殊场景,需要在不替换内核的前提下给内核“动手术”。考虑如下两种场景...原创 2020-04-23 10:26:39 · 257 阅读 · 0 评论 -
一个黑客的自白书
我摊牌了,其实我是一名黑客,这是我的自白书。我将坦白当我准备入侵一个目标时,我是如何收集信息并入侵的。最重要的是,我会给你们一些有用的忠告。我是如何收集信息的当我有了一个目标,我就需要开始对目标进行信息收集。信息收集阶段很重要,因为目标一般对我来说都是黑盒子,我需要进行大量的信息收集才能知道这个系统的运行原理,以及哪里有漏洞可以利用。收集信息一般分为以下几种类别,咳咳,划重点了,必考的,...原创 2020-04-22 16:48:53 · 699 阅读 · 0 评论 -
异步函数的两个视角
我们来一起看一下两个程序员之间的故事。以下示例代码是用Scala写的,不过本文所讲的话题并不仅限于Scala,任何有Future/Promise支持的语言都是适用的。下面这个wiki页面罗列了各个有Future/Promise支持的语言,已经涵盖了大多数的常用语言。Future与promise实现列表我是异步函数的编写者我写了两个异步函数,来提供给其他程序员同事使用。type Call...原创 2020-04-21 16:02:58 · 245 阅读 · 0 评论 -
后端开发实践系列之四——简单可用的CQRS编码实践
本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生。20多年前,Bertrand Meyer在他的《Object-Oriented Software Construction》一书中提出了CQS(Command Query Seperation,命令查询分离)的概念,指出:Every method should either be a command that perf...原创 2020-04-21 10:32:46 · 467 阅读 · 0 评论 -
Apache HBase内核深度剖析
摘要前面一篇文章介绍了Kafka的具体内容,今天讲述一下HBase相关的知识。首先HBase作为大数据发展初期伴随Google三大论文问世的一个组件,在今天依旧被广泛的应用,今天我们来仔细的分析一下HBase的内部原理,了解一下HBase的具体内幕,以便在工作中更好使用它。以下内容涉及到的源码基于HBase 的Master分支编译出的最新的3.0.0版本。HBase相关算法与数据结构基础知...原创 2020-04-09 18:52:00 · 253 阅读 · 0 评论 -
异地情侣如何安全地传递情书 — 哈希时间锁定机制剖析
在探索学习区块链扩容方面的技术时,了解到跨链是区块链二层扩容的重要部分,而实现跨链的技术主要有:公证人技术、中继/侧链技术、哈希时间锁定技术。接下来,我们将在这篇文章中详细介绍哈希时间锁定技术的原理及实现等。故事从前有一对分隔异地的情侣,他们用写信互诉衷肠,不过他们担心邮递员会偷窥信中的情话。男主想到了一个好点子,他让邮递员将一个盒子投递给女主,盒子里放着一把打开的锁,女主心领神会,写好书信,...原创 2020-04-01 17:18:51 · 813 阅读 · 0 评论 -
Apache Kafka内核深度剖析
摘要目前来说市面上可以选择的消息队列非常多,像activemq,rabbitmq,zeromq已经被大多数人耳熟能详,特别像activemq早期应用在企业中的总线通信,基本作为企业级IT设施解决方案中不可或缺的一部分。目前来说Kafka已经非常稳定,并且逐步应用更加广泛,已经算不得新生事物,但是不可否认Kafka一枝独秀如同雨后春笋,非常耀眼,今天我们仔细分解一下Kafka,了解一下它的内幕。...原创 2020-04-01 12:28:31 · 332 阅读 · 0 评论 -
一个输入框你要做一周?
如果PO说这是个很小的改动,你不要信他一次有争议的估点在某次迭代会议上,PO希望交付这样一个“简单”功能:在应用中,用户可以输入自己的地址,这样我们可以定期邮寄一些宣传册给用户。按照PO的描述,这只是一个很简单的文本输入框,用户填写地址之后,地址信息随着其他个人信息一起存到数据库即可。PO甚至在白板上画了一个不太规则的长方形作为示意,然后满怀期望的将目光投向了你 — 一个做事情还算靠谱的...原创 2020-01-19 17:40:51 · 660 阅读 · 0 评论 -
日志中的用户隐私安全
摘要:对于敏捷团队,安全卡应该提到比业务卡更高的优先级,同样需要放在backlog里面进行track,需要kick off、deskcheck,需要一个正经的流程或者仪式感强化成员的意识:安全卡和业务卡、Bug卡都是项目交付中的一等公民。与“中国人愿意用隐私交换便利性”的心态完全不同,欧美国家在个人隐私保护方面明显走得更早也更远一些。在2018年5月GDPR发布前后的一段时间里,保护个人隐...原创 2020-01-16 10:49:49 · 7645 阅读 · 0 评论 -
黑盒项目之历史原因
摘要:很多团队在习惯性的说出“历史原因”的时候,更多的是一种为了掩盖团队当前对这样的做的原因一无所知的说辞。因为项目运行过久,团队成员的更迭,很多项目上存在的问题或者说现状,对于现在的团队成员而言,俨然成了一个黑盒子。当你听到团队聊当前现状的原因里包括诸如“因为过去”,“以前就是这样”之类的字眼的时候,就要开始警惕了。一个团队常常会过度依赖项目开始的时候制定下来的规矩,认为遵守了这些就代...原创 2020-01-03 18:32:42 · 234 阅读 · 0 评论 -
修复缺陷的正确姿势
如果给我一个小时来修复一个缺陷,我会花50分钟来写测试,用剩下的10分钟来改代码—— 本来是一句模仿爱因斯坦的名言,结果发现爱因斯坦并没有说过……你确定这是个缺陷吗?下午2点,你喝下了一杯拿铁,它可以保证你在接下来的几个小时内保持清醒。突然,一位QA同事急匆匆的走了过来,从他的表情你就看出来事情不妙。果然,他告诉你SIT环境有个重大缺陷,如果不及时修复,好几个测试流程都不能进行。没错,你...原创 2019-11-07 14:31:48 · 852 阅读 · 0 评论 -
后端开发实践系列之四——简单可用的CQRS编码实践
本文只讲了一件事情:软件模型中存在读模型和写模型之分,CQRS便为此而生。20多年前,Bertrand Meyer在他的《Object-Oriented Software Construction》一书中提出了CQS(Command Query Seperation,命令查询分离)的概念,指出:Every method should either be a command that perf...原创 2019-10-18 14:26:55 · 258 阅读 · 0 评论 -
标准化技术下的软件开发
聊到集成测试、单元测试等测试分类,我想大多数人都有类似困惑或讨论,集成测试和 E2E 测试到底有啥区别。甚至还有一些系统测试、配置项测试等概念,不但让我们这种非 QA 专业的人弄不清楚,在和我们的 QA 同学讨论时也很难得到清晰的结论。家里有一台古董级别的笔记本,掌托和键盘几乎已经被磨花了,一天突然想检查下有没有特别的资料然后好处理掉它。一份测试相关的国标文档(GB/T 15532-2008)吸...原创 2019-09-27 11:21:31 · 372 阅读 · 0 评论 -
架构杂谈:737 MAX8 启示录
什么是架构?老规矩,引用 wiki:软件架构是有关软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计。请在脑子里先记下两个关键词:整体和抽象。本文将给你一些更深入的理解。架构值多少钱?737 MAX8 事故是前一阵儿的大事件,那么,它跟架构有什么关系呢?上图是传统的 737,下图则是 737 MAX8,可以看出,新的发动机更加短粗。从 1967 年 737-100...原创 2019-09-18 11:20:41 · 220 阅读 · 0 评论 -
使用Domain-Driven创建Hypermedia API
在现实世界中我们会遇到各种各样的复杂场景,没有一种API设计方式可以应对所有的场景。区别于”Consumer-Driven Contract”,本文将描述另外一种设计API的方式:Domain-Driven API。这不是API设计的标准方法,但是也许他可以给你灵感,帮助你设计出更具有表达力的API。POST /api/customerPOST /api/customer/orderPUT ...原创 2019-08-28 14:21:43 · 347 阅读 · 0 评论 -
后端开发实践系列——开发者的第0个迭代
在ThoughtWorks,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行了一段时间之后再来反观,我总会发现一些不足的地方,要么测试分类没有分好,要么基本的编码架子没有考虑周全。另外,我在工作中也会接触到很多既有项目,公司内部和外部的都有,多数项目的编码实践我都是不满意的。比如,我曾经新加入一个项...原创 2019-07-04 15:03:35 · 363 阅读 · 0 评论 -
开发者如何快速熟悉一个新敏捷项目
在ThoughWorks有一句流传甚广的话 —— “在ThoughtWorks需要有拥抱随时变化的心态“,因为我们践行敏捷、我们有各种各样的客户,而商机稍纵即逝。作为普通的dev,最明显的感受是不会像其他互联网公司一样长期待在一个固定的项目,有足够的时间了解项目的上下文和背景。我们的项目周期足够短,甚至有时候几周都算很正常,项目的频繁切换对dev的要求就是需要快速了解一个新的项目。这是我在Tho...原创 2019-06-26 10:32:46 · 403 阅读 · 0 评论 -
云计算,从何而来,正向哪里而去
云计算平台在2008年出现在公众面前的时候,我和大多数人一样,并没有意识到这是一场影响深远的技术变革。并不是缺乏洞见,而是因为云计算的概念非常混乱。当时,作为倡导云计算的两大巨头——Amazon和Google,分别拿出了EC2(2010 Jan Radar)和GAE(Google App Engine 2010 August Radar)。今天我们自然可以很清楚地知道,这两个产品分别对应IaaS...原创 2019-06-14 16:23:17 · 729 阅读 · 0 评论 -
ISOMORPHIC 的升级之路
近些年来,史诗级网游 Web Online 中,一个新兴职业 —— Isomorphic JavaScript Application —— 越来越多地得到了玩家的青睐。Web Online 是一款由地球 Online 玩家基于其游戏平台进行二次开发创作出的网络游戏,特点在于可以自由创建 PC 与 NPC,不过部分地图对于 NPC 的创建管控较严格。主要游戏方式为玩家控制其 PC 与他人的 NP...原创 2019-06-13 17:58:00 · 187 阅读 · 0 评论 -
如何增强Linux内核中的访问控制安全
背景前段时间,我们的项目组在帮客户解决一些操作系统安全领域的问题,涉及到windows,Linux,macOS三大操作系统平台。无论什么操作系统,本质上都是一个软件,任何软件在一开始设计的时候,都不能百分之百的满足人们的需求,所以操作系统也是一样,为了尽可能的满足人们需求,不得不提供一些供人们定制操作系统的机制。当然除了官方提供的一些机制,也有一些黑魔法,这些黑魔法不被推荐使用,但是有时候面对具...原创 2018-12-06 10:29:56 · 976 阅读 · 0 评论 -
DDD的终极大招——By Experience
以DDD思想和微服务架构为代表的新的架构时代正在逐步形成,不同方法和工具的涌现让人激动不已,同时这个过程也让人感觉到些许的不安,因为没有一套方法和一套架构能够打遍天下,我们能明确告诉所有组织和团队的,也只是架构设计上应该“响应变化胜过遵循计划”!具体到采用哪一种架构设计思想和方法,仿佛都需要增加一个定语“这取决于……”。以去年的“明星”方法Event Storming(ES)为例,今年已经开始被...原创 2018-10-30 10:24:46 · 309 阅读 · 0 评论 -
在 Windows 上可以用 Docker 吗?
Docker,或者准确一点说,容器技术,在近几年里几乎成为了应用分发和集群部署的默认技术了。背景部分,如果感兴趣,请参考闲谈集群管理模式一文。Docker 生态的成熟还有赖于其周边工具和实践模式的兴起。比如,曾经雨后春笋般出现的编排技术,以及基于容器技术的 DevOps 实践大规模地开展。那么这么好的技术,在 Windows 上能用吗?在各种场合,都有人与我讨论这个的话题。每次听到这样的疑问,...原创 2018-10-17 11:35:36 · 651 阅读 · 0 评论 -
Lightweight Architecture Decision Records | 技术雷达
写在前面ThoughtWorks每年都会出品两期技术雷达,这是一份关于科技行业的技术趋势报告,在四个象限:技术、平台、工具以及语言和框架对每一个条目(Blip)做采用、试验、评估、暂缓的建议。(参考阅读:解读技术雷达的正确姿势)一直以来,我们都未对每一个Blip做进一步的解读,而这次决定尝试一个新的专栏——《雷达哔哔哔》,由作者根据自己实践与理解,对雷达中部分条目作出解析,致力于用一篇篇短小精...原创 2018-10-18 11:47:52 · 425 阅读 · 0 评论 -
什么是框架?
先摘录并翻译一段 wiki:In computer programming, a software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus provi...原创 2018-09-26 11:26:45 · 867 阅读 · 1 评论 -
写了这么多年代码,你真的了解设计模式么?
昨天和同事聊到最近他要做的一个培训,大概的课程是这样的:第一天:上午:面向对象原则(OO+SOLID )下午:设计模式(Design Pattern)第二天:上午:简单设计(SimpleDesign)下午:重构到模式(Refactor to DesignPattern)面向对象原则,设计模式,简单设计,重构到模式……看起来都是常规操作,但你有想过他们的关系么?忍不住要山寨...原创 2018-09-20 14:28:56 · 409 阅读 · 0 评论 -
写了这么多年代码,你真的了解SOLID吗?
尽管大家都认为SOLID是非常重要的设计原则,并且对每一条原则都耳熟能详,但我发现大部分开发者并没有真正理解。要获得最大收益,就必须理解它们之间的关系,并综合应用所有这些原则。只有把SOLID作为一个整体,才可能构建出坚实(Solid)的软件。遗憾的是,我们看到的书籍和文章都在罗列每个原则,没有把它们作为一个整体来看,甚至提出SOLID原则的Bob大叔也没能讲透彻。因此我尝试介绍一下我的理解。...原创 2018-09-12 13:55:15 · 1025 阅读 · 0 评论 -
给Java程序员的Angular快速指南
太长不读版:Spring + Angular 的全栈式开发,生产力高、入门难度低(此处省略一万字),是 Java 程序员扩展技术栈的上佳选择。如果你动心了,接下来就是那省略的一万字……痛点 - 团队分工与协作在前后端分离的开发方式中,拆故事卡是个难题。如果前后端同时工作于一张卡上,但配合不够默契或节奏不同步,就会出现一方空转的现象。如果前后端各一张卡,又不容易实现端到端...原创 2018-07-25 17:07:36 · 3875 阅读 · 0 评论 -
以用户为中心的软件开发
问题今天这个时代迭代开发已经成为常识,甚至政治正确。随便谁就能给你扯两句mvp。敏捷也从一个开发的名词变成了管理名词。迭代,测试,反馈,名词满天飞。人人都在说这些术语,仿佛他们真的就懂怎么做软件了。起码,觉得自己真的懂怎么创新了。然而经不起细聊,一旦深入下去聊一个mvp,聊聊他的迭代计划。就会发现露馅了张嘴闭嘴,谈的都是功能。这个迭代要交付几个功能,这个mvp多了什么功能?他的竞争对手都有哪些...原创 2018-12-12 11:39:46 · 1227 阅读 · 0 评论 -
可视化架构设计——C4介绍
好多年前,同事徐昊说过的一句话给了我很大启发,他说“纸上的不是架构,每个人脑子里的才是”。这句话告诉我们,即便是天天工作在一个团队里的人,对架构的认识也可能是不一样的。每个人嘴上说的是类似的话,但心里想象的画面仍然是不一样的。在多年的工作中,我越来越认可这句话所揭示出的道理。软件开发是一个团队协作的工作,混乱的理解会造成架构的无意义腐化、技术债的无意识积累、维护成本的无价值上升。最近听到一句话,...原创 2019-01-18 11:16:57 · 5442 阅读 · 1 评论 -
软件的高质量意味着高成本?
文:Martin Fowler译:王薇审校:刘申软件开发项目中,一个常见的争论是花时间提高软件质量还是专注于发布更有价值的功能。通常,功能的交付压力会主导着讨论,导致许多开发人员抱怨他们没有时间提升架构和代码质量。“Betteridge’s Law of headlines”这句谚语说的是任何以问号结尾的文章标题都可以用“否”来概括。了解我的人知道我会颠覆这样的规律,但是这篇文章讨论的更...原创 2019-06-06 16:06:04 · 1591 阅读 · 0 评论 -
不就是个短信验证嘛,还真挺复杂的
「摘要」支撑子域是为了项目成功必须要处理的问题,但由于没有现成、成熟的解决方案,必须要定制,费时费力如果能恰当地识别支撑子域的边界,形成"可复用"的"解决方案",就可以将其从支撑子域简化为通用子域,降低成本和风险不就是个短信验证嘛,有这么复杂吗?前几天安全专家马伟发布了《不就是个短信登录API嘛,有这么复杂吗?》,文章从“新增手机号和短信验证码登录”简单的一句话需求最终演变为...原创 2019-05-24 10:44:11 · 565 阅读 · 0 评论 -
微服务架构下的质量迷思——混沌工程
微服务概念的提出至今已多年,这期间也是互联网及互联网+发展的高速期,消费市场变化莫测,消费者也变得越来越挑剔,越来越多的互联网巨头甚至传统行业都开始对自己的遗留系统进行微服务改造。原创 2019-05-05 10:08:03 · 485 阅读 · 0 评论 -
不就是个短信登录API嘛,有这么复杂吗?
一个短信登录API背后,还能牵扯出这么多事儿。原创 2019-04-24 10:20:31 · 209 阅读 · 0 评论 -
都是脏数据惹的祸
调查分析生产环境缺陷,到最后定位是数据问题的时候,总是让人浑身轻松... 于是,“脏数据”就跟测试的“随机挂”一样,成为了光荣的“背锅侠”!脏数据 ≠ 代码问题,真的是这样吗?先来深入了解一下脏数据。原创 2019-04-26 10:30:47 · 526 阅读 · 0 评论 -
从技术雷达看DevOps十年-DevOps和持续交付
ThoughtWorks作为DevOps运动最早的见证者和奠基人,并没有意识到那个周末聚会将在接下来10年给全球IT行业带来深远影响。原创 2019-04-17 10:36:57 · 366 阅读 · 0 评论 -
细说API – 重新认识RESTful
如果你是一个客户端、前端开发者,你可能会在某个时间吐槽过后端工程师的API设计,原因可能是文档不完善、返回数据丢字段、错误码不清晰等。如果你是一个后端API开发者,你一定在某些时候感到困惑,怎么让接口URL设计的合理,数据格式怎么定,错误码怎么处理,然后怎么才能合适的描述我的API,API怎么认证用户的请求。在前后端分离和微服务成为现代软件开发的大趋势下,API设计也应该变得越来越规范和高效。本...原创 2019-01-16 11:32:09 · 474 阅读 · 0 评论 -
亲历者说:敏捷?我被洗脑了吗?
几年之前我还是个野生程序员的时候,对“敏捷”这个词是有些抗拒的。那时候,要么是没有想法、懒得去理会,要么就是主观上拒绝: 肯定又是些无所事事的人弄出来的无聊概念,帮他们自己刷存在感的东西! 敏捷,就是那些咨询公司弄出来给别人洗脑的嘛,那些理念太空,根本无法落地! 那些一大堆概念都是些什么鬼?条条框框太多了,运作起来太麻烦了! 不用敏捷,我们现在不也挺好的吗?敏...原创 2018-06-20 12:48:19 · 482 阅读 · 0 评论