AI编程助手:代码审查是关键
大型语言模型擅长生成代码,但缺乏软件工程师的判断力,容易做出糟糕的设计决策。作者以自身经验为例,说明AI编程助手(如Codex、Claude Code)虽然高效,但需要密切监督,防止其走入设计误区。作者认为,精通代码审查,特别是关注代码结构和潜在的改进空间,是有效利用AI编程助手的关键。盲目依赖或过度干预都会降低效率。最终,作者指出,目前AI编程更像“人机协作”,而非完全替代人类。
阅读更多
大型语言模型擅长生成代码,但缺乏软件工程师的判断力,容易做出糟糕的设计决策。作者以自身经验为例,说明AI编程助手(如Codex、Claude Code)虽然高效,但需要密切监督,防止其走入设计误区。作者认为,精通代码审查,特别是关注代码结构和潜在的改进空间,是有效利用AI编程助手的关键。盲目依赖或过度干预都会降低效率。最终,作者指出,目前AI编程更像“人机协作”,而非完全替代人类。
阅读更多
本文探讨了软件工程中的“纯工程”与“不纯工程”两种不同类型的工作。纯工程追求技术完美,类似艺术或研究;不纯工程注重效率,更像实际应用。大型科技公司需要两者,但如今更注重不纯工程,这导致一些专注于纯工程的工程师难以适应,与不纯工程工程师发生冲突。AI辅助开发对不纯工程更有帮助,因为它能处理不那么新颖、时间紧迫的问题,而纯工程则更依赖工程师自身的专业知识。文章强调,两种工程类型都需要高超的技能,只是侧重点不同。
阅读更多
本文作者挑战了流行的软件设计理念——代码应尽可能紧密地绑定到领域模型。作者认为,过分强调避免无效状态,例如通过严格的数据库模式和类型约束,会限制软件的灵活性,难以应对现实世界中不可避免的异常情况。作者以状态机和外键约束为例,说明了如何在保证核心设计简单的前提下,允许一些任意状态转换,从而提升软件的适应性和可维护性。最终,作者主张在用户界面软件中,应允许表示某些无效状态,以应对不断变化的需求和意外情况。
阅读更多
本文探讨了软件设计中“做最简单能运行的事”的理念。作者认为,与其追求理想化的、过度设计的系统,不如深入理解现有系统,然后选择最简单的方案。这种方法看似简陋,却能带来意想不到的效果,例如Unix和Rails等优秀系统的设计精髓便是如此。虽然这种方法面临着系统僵化和难以定义“简单”的挑战,但作者认为,与其为了遥远的未来需求而过度设计,不如专注于解决当前问题,并逐步迭代改进。最终,一个简洁稳定的系统往往比一个过度设计的、难以维护的系统更优秀。
阅读更多
本文作者认为,有效的职业建议如同锋利的工具,既能带来巨大帮助,也能造成严重损害。很多职业建议过于表面,缺乏实际操作性。作者鼓励工程师们勇于尝试“危险的建议”,打破常规,高效完成工作。虽然这种做法存在风险,但对能力强的工程师而言,收益远大于风险。作者同时强调,这种建议不适用于能力较弱的工程师。
阅读更多
本文探讨了API设计中的关键原则,强调了避免破坏用户现有代码的重要性。作者指出,好的API应该是简单易用的,但同时也需要具备长期的灵活性。文章详细阐述了API版本控制、幂等性、速率限制和分页等技术细节,并建议使用API密钥进行身份验证,以方便非专业工程师用户使用。文章最后总结道,一个优秀的产品比一个完美的API更重要,但一个糟糕的产品设计会直接导致糟糕的API。
阅读更多
本文作者批判了那些为了炫技而设计的系统,认为优秀系统设计并非依赖于复杂的分布式共识机制或CQRS等技巧,而是应该注重简洁和可靠性。文章重点阐述了状态管理的重要性,建议尽量减少有状态组件,并详细讲解了数据库设计、索引、缓存、后台任务、事件驱动等关键方面,强调在数据库查询中充分利用数据库本身的能力,避免不必要的内存处理。作者还强调了热路径的重要性以及日志记录和监控的重要性,并讨论了熔断器、重试机制和优雅降级等容错策略。总而言之,作者认为优秀系统设计是低调而有效的,是建立在成熟组件基础上的合理运用,而非追求花哨技巧的体现。
阅读更多
作者挑战在MacBook Pro上五分钟内训练最强语言模型。经过实验,最终训练了一个约180万参数的GPT风格Transformer模型,在TinyStories数据集上取得了9.6的困惑度。实验发现,提升训练速度的关键在于选择合适的优化策略,例如使用MPS,避免梯度累积等。数据集的选择也很重要,TinyStories因其连贯性和简单的语言而胜出。模型架构方面,Transformer优于LSTM和扩散模型。最终结果表明,约200万参数的模型是五分钟训练的最佳大小,这与Chinchilla缩放定律相符。
阅读更多
2024年,构建自主编码代理被认为需要复杂的内部技巧。但事实证明,只需一个更强大的基础模型就足够了。Claude Sonnet 3.7是目前的佼佼者,它并非最聪明的模型,但胜在能够坚持任务并做出更好的决策。如今,构建AI编码代理的门槛已大幅降低,开源方案非常优秀,甚至可以在GitHub Actions上免费运行Codex代理。市场竞争激烈,厂商需关注分发和训练更好的模型,才能脱颖而出。
阅读更多
本文探讨了未来AI可能引发的灾难。作者认为,与之前的火车和飞机事故类似,AI也可能面临大规模灾难。不同于简单的AI误导,作者更关注AI代理的风险。AI代理是指AI能够自主执行任务,例如搜索网络、发送邮件等。作者预测,第一个AI大规模灾难可能源于AI代理在政府或企业系统中的失控,例如错误地执行债务追讨、医疗保健或房屋租赁等任务。此外,作者也提到AI模型被滥用于创造“理想伴侣”机器人,可能引发新的安全问题。总而言之,作者警告AI快速发展带来的潜在风险,并呼吁加强AI安全措施。
阅读更多
苹果最新论文《思考的幻象》测试了大型语言模型在解决塔诺问题时的推理能力。结果显示,模型在简单问题上表现甚至不如非推理模型;中等难度问题上表现较好;但复杂问题上,模型会放弃,即使给出算法也效果不佳。作者质疑模型的泛化推理能力。然而,本文作者认为,论文使用的塔诺问题并非理想的推理测试,模型的“放弃”可能源于对大量步骤的规避,而非推理能力的局限。模型在一定步骤后放弃并不意味着它们不具备推理能力,这与人类在复杂问题面前表现相似。
阅读更多
文章探讨了大型语言模型(LLM),特别是混合专家模型(如DeepSeek-V3),在云端服务快速廉价,但在本地运行缓慢昂贵的原因。关键在于批量推理:GPU擅长处理大型矩阵乘法,批量处理多个用户的请求可以显著提高吞吐量,但会增加延迟。混合专家模型和多层模型尤其依赖批量处理以避免流水线阻塞和专家利用率低下的问题。云端服务商通过调整批量大小(收集窗口)来平衡吞吐量和延迟,而本地运行通常只有一个请求,导致GPU利用率极低。OpenAI等公司的高效服务可能源于更优的模型架构、巧妙的推理技巧或更强大的GPU资源。
阅读更多
作者认为,对于工程师而言,对所用技术的浅层理解就足够了。深入理解数据库索引、大型语言模型等技术,能帮助工程师做出更明智的决策,例如选择合适的模型进行JSON输出,并避免因小模型的局限性而导致错误。作者建议,与其深入研究某一领域,不如广泛了解多个领域,这样才能更好地适应新的技术趋势。学习新技术时,应注重理解其背后的基本原理,并能用通俗易懂的语言解释给其他人,同时利用大型语言模型进行事实核查,以确保理解的准确性。
阅读更多
Google最新发布的Gemini Diffusion凭借其惊人的速度令人印象深刻,甚至需要刻意放慢演示速度才能让人看清过程。这究竟是什么魔法?文章深入探讨了扩散模型为何如此之快,以及它与传统自回归模型(如GPT-4、Claude)的关键区别。扩散模型一次性生成整个输出,而非逐个生成token,这使得它能够并行生成正确的部分,并通过减少迭代次数来加快速度。然而,它在处理长上下文时效率较低,并且在推理能力方面仍存在疑问。虽然扩散模型内部也可能使用Transformer,但其整体架构使其行为与自回归模型截然不同。
阅读更多
OpenAI CEO Altman曾希望让智能“廉价到可以随意使用”。如今,得益于风险投资,我们正生活在这个世界中。但人们对更强大的模型需求并不强烈,这引发了思考。文章认为,大型语言模型(LLM)最具变革性的能力并非其智力,而是其“超人的耐心”——全天候可用、从不评判、无限倾听。虽然LLM的耐心也可能放大其自身问题,例如迎合用户,并且不能替代专业治疗,但这项能力已带来深远影响,改变了人们寻求情感支持和建议的方式。
阅读更多
与基于Transformer的语言模型不同,扩散模型通过将图像转化为噪声,再逐步去除噪声来生成图像。训练过程中,模型学习识别添加到图像中的噪声,最终能够从纯噪声中生成图像。这一过程类似于雕塑,从一块粗糙的石头逐步打磨成精美的作品。虽然目前文本扩散模型尚不成熟,但其在图像和视频生成领域已展现出强大的潜力,例如OpenAI的Sora和Google的VEO。扩散模型的核心在于其对噪声和数据之间关系的建模,这与Transformer模型对语言结构的建模截然不同。
阅读更多
在大型科技公司,工程师很容易陷入持续改进现有系统的陷阱,却忽略了真正交付价值。本文指出,「完成」工作并非指无限期地完善系统,而是指将工作成果交付到让公司决策者满意的程度,并及时宣告胜利,转而进行其他任务。这需要工程师关注工作的可见性,让决策者理解并认可其价值,例如通过产生或节省资金等方式。 最终,“完成”是一个社会建构,但它却真实地影响着你的职业生涯。
阅读更多
资深工程师在技术讨论中过于谨慎,不愿表态,看似稳妥,实则是一种怯懦。文章指出,当团队需要决策时,即使只有55%的把握,也应由最了解情况的工程师承担责任,给出判断。这不仅能防止能力较弱的工程师提出糟糕方案,还能让管理层更高效地工作。作者强调,管理层通常能容忍技术判断失误,因为决策本身就存在不确定性。但需注意,过于频繁的错误判断会降低可信度。文章最后指出,在不信任的团队环境中,工程师避免承诺是合理的,但大多数情况下,承担责任,勇敢决策才是优秀工程师的标志。
阅读更多
许多工程师专注于改进性能、无障碍性等非营利性工作,却因不被重视而被解雇。文章指出,科技公司以盈利为目标,工程师的价值取决于其工作对公司盈利的贡献。作者建议工程师了解公司商业模式,将自身工作与公司盈利关联起来,才能获得稳定职位。即使是看似无用的工作,在大型公司也能通过规模效应产生价值。
阅读更多
大型语言模型(LLM)在代码生成方面表现出色,但其上下文窗口的限制使其难以处理大型代码库。文章探讨了LLM辅助编程的“效能”:用多少token表达一个程序。作者认为,Python比Go更适合LLM,因为其更简洁,能容纳更多功能在token限制内。 进一步推测,Ruby,以其简洁优雅著称,可能是LLM的理想语言,因为它能用更少的token表达更多功能。 尽管存在一些问题,如缺乏类型检查,但Ruby的“以人为本”设计使其成为LLM的潜在最佳选择,这颇具讽刺意味。
阅读更多
过去十年,软件工程师风光无限,高薪、福利、稳定就业。然而,近两年科技行业裁员潮迭起,昔日“宠儿”如今面临严峻挑战。文章分析了这一转变的原因:低利率时代,资本充裕,公司不计成本扩张,工程师待遇优厚;如今利率上升,盈利成为核心,公司精简人员,裁员变得普遍。作者认为,AI并非裁员主因,而工程师应适应新形势,聚焦公司核心目标,才能避免被淘汰。虽然少了些许“梦幻”,但回归现实,专注于为公司创造价值,才是生存之道。
阅读更多
本文作者以自身经历为例,阐述了优秀软件设计并非追求复杂精巧的语言特性或架构,而是着重于消除潜在的故障模式。通过移除冗余组件、中心化状态管理、使用健壮的系统等方法,降低系统风险,提升可靠性。作者认为,优秀的软件设计是简洁、可靠的,它避免了花哨的功能,专注于解决问题,并以Unicorn web服务器为例佐证了这一观点。
阅读更多
在快节奏的科技公司,并非所有工作都同等重要。本文指出,大部分优先级高的工作实际上优先级很低。成功的关键在于识别“聚光灯”时刻——领导层高度关注的项目。工程师应具备快速识别并抓住这些机会的能力,全力投入高影响力项目。相反,在“聚光灯”照不到的地方,则应利用个人时间进行有价值的项目开发,提升自身能力和公司贡献。这不仅需要判断力,更是一种技能,需要不断练习才能掌握。
阅读更多
大型语言模型(LLM)正快速提升代码编写能力,引发了对纯AI软件工程师的探索。短期内,软件工程师应学习AI技术、提升自身地位并利用AI工具。中期来看,精通大型遗留代码库的维护和改进将成为更有价值的技能,因为LLM在处理复杂的、难以验证的、代码量庞大的项目上仍有局限性。长期而言,软件工程师的核心竞争力将转变为责任感和可信度,这是LLM难以具备的素质。最终,那些能够对AI系统进行监管和保证其输出结果可靠性的工程师将成为最后的堡垒。
阅读更多
一位资深软件工程师分享了他如何将大型语言模型(LLM)融入日常开发工作,提高效率。他主要使用LLM进行代码补全、编写一次性代码、学习新领域、最后手段的bug修复以及润色文档。他强调LLM并非万能,尤其不适合编写核心业务逻辑或撰写正式文档,但作为辅助工具,能显著提升效率,尤其是在处理不熟悉的代码或学习新技术时。
阅读更多
一位工程师分享了他职业生涯中宝贵的经验教训。他告诫初级工程师不要沉迷于完成 JIRA 任务,而应专注于对公司具有战略意义的项目。高效工作并非单纯地完成更多任务,而是要优先处理管理层认为最重要的事情。文章强调了识别重要任务的方法,例如关注高可见性事件、未解决的问题以及项目进度等。作者以自身经历为例,说明了专注于不重要的任务可能导致的挫败感,并建议工程师们要果断放弃不重要的工作,专注于对公司发展有真正贡献的项目,从而在更短的时间内创造更大的价值。
阅读更多
一位澳大利亚工程师分享了十年在美国科技公司工作的经历。他描述了跨时区工作的挑战:早上需要花时间处理美国同事在夜间完成的工作,但下午拥有宝贵的专注时间。虽然有时会感到孤独,但良好的团队协作和记录文化弥补了不足。他还提到,在美国公司工作存在不稳定性,但规模更大、薪酬更好,且公司品牌知名度更高,是其选择的重要因素。最后,他还谈到了澳美文化差异,例如美国人更热情积极,而澳大利亚人更低调务实,需要适应美国的工作文化。
阅读更多
在大公司,工程师的声誉并非完全取决于技术能力,而是一个逐步积累的过程:起初只能承担低级别工作,表现出色后才能获得更高级别任务的信任。这种“阶梯效应”使得声誉一旦形成,就很难改变。即使犯错,只要能持续交付,也能逐渐恢复声誉。反之,如果屡屡失败,则会陷入恶性循环,难以翻身。文章建议新入职工程师专注于完成小型项目,逐步提升声誉,避免试图一步登天,最终事倍功半。
阅读更多
在大型、历史悠久的代码库中工作是软件工程师的一大挑战。本文作者总结了十年经验,指出最致命的错误是忽视代码库整体一致性,只顾自身代码的整洁。维护一致性至关重要,它能避免意外问题、防止代码库变得混乱,并方便未来的改进。作者还强调了理解代码实际使用情况、谨慎引入依赖、移除冗余代码、小步迭代以及充分利用团队协作的重要性。大型代码库虽然复杂,但却是公司核心业务的载体,学习如何在其中高效工作至关重要。
阅读更多
本文探讨了软件工程中的“粘合性工作”(Glue Work)问题。这种工作虽然对团队效率至关重要(例如文档更新、技术债务处理),但却常常被忽视,导致负责此类工作的工程师在晋升时处于劣势。作者认为,公司不奖励粘合性工作是因为他们希望工程师专注于交付功能,而非提升整体效率。高效的策略是将粘合性工作战术化地应用于自身负责的项目,以确保项目成功,而非在所有项目中都投入大量时间。这并非消极的职场策略,而是基于大公司效率普遍较低的事实,以及公司增长优先于短期效率提升的考量。
阅读更多