IT技术博客大学习 共学习 共进步
首页 / 腊八粥
IT 2016-03-14 23:26:57 / 累计浏览 1,140

产品设计师的前世今生

这是一篇关于设计行业演变的观点文。作者从上世纪五六十年代杂志行业的变革出发,梳理了设计头衔的变迁史——从“艺术指导”到“交互设计师”,再到如今流行的“产品设计师”。 文章的核心观点是,头衔的更迭更多是受市场风向和技术工具的影响,而非设计本质的改变。例如,当Flash技术兴起时,“交互设计师”头衔应运而生;而随着软件产品成为主流,市场便转向了“产品设计师”。作者指出,从Alexey Brodovitch在杂志社的版面设计,到如今在敏捷冲刺中绘制线框图,优秀设计师的核心特质——以用户为中心、有目的、可迭代、善于协作——一脉相承。 文章揭示了一个现象:设计师发明或选择特定头衔,往往是因为这符合当前市场的经济利益和专业细分需求。然而,市场真正需要的从来不是一个时髦的头衔,而是一群关心用户、乐于创造、持续改进的优秀设计师。无论媒介如何从纸张变为软件,为用户打造卓越体验的追求始终未变。

IT 2016-03-10 23:55:03 / 累计浏览 2,460

解决 SQL 注入的另类方法

这篇讲的是如何从根本上破解 SQL 注入,而不只是修补漏洞。作者从一个经典场景出发:攻击者通过精心构造的输入,篡改了原本合法的 SQL 查询语义。文章指出,这种问题的根源在于我们过度依赖与 SQL 语法等价的、但更容易被误用的“字符串拼接”表示法。 核心思路是跳出“过滤或转义”的传统框架,转而利用 SQL 本身是公理化语言的特性。文章提出了三种另类的防御策略:第一,将 SQL 模板转换为语法严格、结构不同的等价表示,比如前缀表示法或欧拉表示法,让攻击者的注入在新语法下直接失效;第二,为 SQL 关键字替换一套自定义的、任意的 token 集合,构建一个“私有语言”,使注入的 `or`、`=` 等字符成为无效代码;第三,验证 SQL 语句的结构不变量,例如填充前后 token 的数量必须恒定,任何偏离都意味着注入发生。 作者通过具体的代码示例,生动地展示了攻击注入在这些策略下是如何因语法错误或结构破坏而“折戟”的。这种从语言理论和形式化角度解决问题的方案,为防御注入攻击提供了一条极具启发性的新路径。

IT 2016-03-01 00:02:26 / 累计浏览 1,020

小谈矢量网络

这篇讲的是 Figma 团队如何重新思考并改进了诞生三十多年的矢量编辑工具。作者从自身游戏开发背景出发,指出传统基于“路径”的钢笔工具在交互上存在诸多反直觉的限制。为此,Figma 提出了“矢量网络”这一新模型。 与路径的单一链条不同,矢量网络允许任意两点之间自由连接和分割,极大提升了形状编辑的灵活性,甚至对用户而言是“无缝”的体验。文章还分享了其他关键改进:弯曲工具允许直接拖拽曲线而非仅靠控制柄,符合直觉;同时,Figma 的填充算法摒弃了传统复杂的“卷绕数”概念,通过智能识别封闭区域并提供油漆桶工具一键开关,让填充操作变得直观。这篇文章揭示了如何通过底层模型的创新,让基础设计工具变得更自然、更强大。

IT 2016-02-16 23:00:07 / 累计浏览 2,020

更好的 SQL 模式的 10 条规则

这篇讲的是数据库模式设计中常被忽视、却会影响长期维护效率的细节。作者从大量实际数据库的读写经验出发,总结了十条黄金法则,帮助开发者从源头避免未来的“痛苦”。 它核心强调命名与结构的清晰性。例如,对象名只用小写字母、数字和下划线,避免使用点、空格和大写,这能消除查询时的引号依赖和大小写混淆。列名和表名应具备自说明性,避免使用晦涩缩写或保留字。外键命名需保持全局一致。 此外,文章给出了具体的数据类型建议:主键推荐使用自增整数而非UUID,以简化查询和数据清理;时间数据应存储为统一的DATETIME类型,并始终使用UTC时区,而非字符串或Unix时间戳。它还指出应追求单一数据源,谨慎使用JSON列进行分析,并避免过度规范化(例如无需为邮编等简单值单独建表)。 遵循这些规则,能让你的数据库结构在未来需求变化和团队扩张时,依然保持清晰、高效且易于维护。

IT 2016-02-13 23:03:08 / 累计浏览 3,980

APP图标的色彩

这篇文章做了一件挺酷的事:用工具批量分析了应用商店里成百上千个APP图标的“支配色”,然后用色轮直观展示了不同类别、平台和排名的APP在色彩选择上的差异。 研究发现,无论是iOS还是Google Play,蓝色和红色都是绝对的主流色,构成了明显的分布群。但细节里很有意思:免费APP图标倾向使用单一颜色,而付费APP的图标则更常组合多种色彩,显得更复杂。社交媒体类APP虽然大家印象中是“蓝色的天下”,但分析显示绿色也有相当比例。游戏APP的色彩则更为丰富和分散。有意思的是,Mac应用商店的色彩分布与iOS非常相似,而Google Play的数据也印证了跨平台的这一趋势。 基于这些发现,作者给出了一个简单的设计师选择指南:想随大流就选蓝或红,想略有不同可以试试绿色,如果想彻底特立独行,那就大胆用上粉色或紫色吧。

IT 2016-02-11 22:55:55 / 累计浏览 2,800

用 HTML 标记的古怪代码注释

这篇讲的是作者如何从一个令他头疼的实际问题出发,为自己“定制”了一套代码注释方法。作者坦言自己一直无法掌握传统的注释方式,尤其是当代码嵌套层次变深后,注释无法清晰标记代码块的开始和结束,导致可读性反而下降。 为了解决这个痛点,他受HTML标签清晰界定范围的特性启发,创造了一种“古怪”的注释风格:在代码块的首尾添加类似``和``的注释。他声称在PHP、JavaScript、甚至Shell脚本中都使用这种方法。这不仅能让他在快速浏览文件时立刻定位到功能模块的边界,还意外获得了一个好处:在Sublime Text编辑器中,整个代码块可以像HTML标签一样被直接折叠起来,让视图更清爽。 作者知道这做法可能不符合某些严苛的编码规范,但他认为这种“小聪明”确实提升了自己定位和理解代码的效率。这篇文章的核心在于展现一个实用主义程序员如何为了实际工作流的顺畅,打破常规、对工具进行个性化改造的思路。

IT 2016-02-07 14:43:31 / 累计浏览 2,080

为什么我要垂直对齐代码(你也要如此!)

这篇讲的是 HackerNews 上关于 Linux Kernel 代码风格的讨论中,一位开发者为“垂直对齐”代码风格的坚定辩护。作者从一个简单例子切入:未对齐的变量声明与对齐后的版本,后者能让 `bob_age = 250` 这样的异常值一眼就能被捕捉到。 文章的核心论点是,编程工作中有大量时间花费在理解现有代码上,而垂直对齐这种看似微小的格式调整,能显著降低这种“理解成本”。作者类比了代码与散文的阅读区别,强调清晰的代码就像一篇好文章,需要借助命名、间隔等“视觉线索”来提升可读性,让接手代码的人能更快理解意图,而非陷入解密格式的泥潭。 文中还延伸讨论了等宽字体与比例字体的争论,但最终落脚点仍是可读性——任何有助于快速理解代码结构的工具(无论是字体还是对齐)都值得采用。作者用略带调侃的“圣战”口吻,实质上是在呼吁开发者们更多地关注代码的“用户体验”,而不仅是功能实现。

IT 2016-02-06 23:33:57 / 累计浏览 2,340

开发者应该了解的 web 性能

这篇文章的核心观点是:网站性能优化没有放之四海而皆准的标准答案,但开发者可以通过理解关键原理来做出更有效的决策。作者从影响网站速度的复杂因素出发,对比了几个常见优化手段的原理与差异。 文章首先指出,单纯追求“页面载入时间”并非最佳目标。作者以亚马逊为例,分析了其“渐进式渲染”策略:即便页面完全载入需18秒,但用户在前1.5秒就能看到首屏关键内容。这引出了对TTFB(首字节时间)的讨论,解释了它为何比整体加载时间更能反映服务器响应与网络传输效率。 具体技术对比方面,文章剖析了几个关键点:使用gzip压缩能显著减少传输字节数;优化图片(而非仅靠CSS调整大小)对移动端用户体验至关重要;清理不必要的脚本与CSS文件可以消除冗余加载。这些措施的共同点在于减少需要传输的数据量。 文章还强调了“关键渲染路径”的概念,即浏览器从获取HTML到绘制内容必须执行的步骤顺序。整体而言,作者旨在帮助开发者超越“照单全收”的优化清单,转而理解每个措施背后“为什么有效”,从而能针对自身应用进行精准调试与验证。

IT 2016-01-27 22:44:11 / 累计浏览 2,020

充分发挥 JavaScript 语言的优势

作者从自身8年JavaScript开发经验出发,分享了如何从“将其视为辅助工具”到“真正发挥语言优势”的心得。他认为,随着Node.js和现代浏览器的发展,JavaScript已成为前端核心,但许多开发者仍未充分利用其特性。 文章聚焦于几个关键实践:利用“头等函数”实现简洁的函数式编程,掌握Array原生的map、reduce等方法来操作数据,以及拥抱ES6的箭头函数、解构等新语法让代码更直观。作者也强调了理解作用域、闭包和类型转换这些“绊脚石”的重要性,并建议谨慎使用class继承,转而以数据流和对象组合来思考程序结构。 对于有一定经验但感觉JavaScript“坑多”的开发者,这篇基于实战教训的总结,提供了从语言特性层面提升代码质量和效率的具体思路。

IT 2016-01-27 22:40:02 / 累计浏览 1,540

CSS 的 22 个必备技巧

这篇讲的是那些能让你的CSS代码更优雅、效果更出彩的实用技巧。文章从现代浏览器开始支持的混合模式(mix-blend-mode)聊起,展示了如何像PS一样在网页上玩转图层混合效果。接着,它解决了“如何给边框加上渐变”这个常见需求,方法是通过一个负z-index的伪元素来巧妙实现。 你还会发现,原来z-index的值也能参与CSS过渡动画,让层级变化变得平滑;一个简单的currentColor关键字,就能让SVG图标和边框颜色自动跟随文字颜色变化,省去了大量重复定义的代码。对于图片显示难题,文章推荐用object-fit属性来替代背景图的background-size,实现更灵活的裁剪和缩放。 此外,文章还分享了如何用纯CSS为复选框和单选按钮打造自定义外观。整体来看,这些技巧都紧贴日常开发场景,代码示例清晰可复用,能帮助前端开发者快速提升页面表现力与代码效率。

IT 2015-11-08 21:58:19 / 累计浏览 3,060

不要对设计师说的话

这篇讲的是设计师与开发者合作时那些看似无害却可能引发矛盾的对话。作者从一线协作经验出发,列举了几句常见的“地雷”发言:比如直接要求“把这个按钮加粗”,或者擅自修改设计稿并说“我能修复”。这些行为的本质,是跳过了对问题本身的讨论,变成了微管理。 文章的核心观点很明确:反馈应聚焦于“是什么”和“为什么”,而非“怎么做”。当你说标题不够突出时,设计师会从视觉层次、系统一致性和整体平衡的角度去优化;反之,一句简单的“加粗”指令,可能破坏精心维护的设计体系。对于开发者无意中修改界面的行为,作者打了一个比方:这就像设计师拿走你即将上线的代码擅自改动,是对专业信任的极大伤害。 作者也指出,设计师对“5像素”这类细节的坚持并非挑剔,而是每一个微小精度的累加,最终定义了产品的质感。而当设计师提出大胆构想时,开发者一句“这不可能”往往过早关闭了对话空间——更有效的做法是说明平台限制,共同寻找替代方案。文章最终指向一种健康的协作文化:用建设性的提问替代生硬的指令,用信任激发彼此的专业判断,共同对产品负责。

IT 2015-11-02 23:05:49 / 累计浏览 2,560

用 JavaScript 实现 mailto:

这篇讲的是如何用 JavaScript 更灵活地控制 mailto 链接。尽管 mailto 作为 URL 不如从前流行,但它在 Web 应用中依然是触发邮件发送最简单直接的方式之一。文章指出,单纯使用 HTML 标签创建 mailto 链接虽常见,但结合 JavaScript 可以实现更多可能。 作者展示了如何通过一个简单的 JavaScript 函数来动态触发 mailto,这样做的好处之一是,能在一定程度上混淆邮箱地址,对抗自动化收集数据的网络爬虫。更重要的是,这为将邮件发送集成到更复杂的业务逻辑中打开了大门,例如在用户执行特定操作(如点击按钮)时才触发。 文章还深入讲解了如何为 mailto 链接添加参数,比如邮件主题和正文,并给出了一个可复用的 JavaScript 函数示例。这个函数会使用 `encodeURIComponent` 对用户输入进行编码,确保生成的 URL 格式正确且安全。作者也提醒,除了常用的 subject 和 body 参数,浏览器对其他邮件头(如 bcc、cc)的支持程度不一,需要谨慎使用。 总的来说,这篇文章把一个看似简单的技术点讲透了,从基础用法到用 JavaScript 增强的实用技巧,为开发者提供了让 mailto 链接更好服务于特定场景的具体思路。

IT 2015-11-02 22:37:03 / 累计浏览 1,920

写 CSS 时要避免的几个地方

这篇文章是一篇观点鲜明的“避坑指南”,作者从实践经验出发,犀利地指出了四个在编写CSS时常见的、需要避免的坏习惯。 作者开宗明义,认为CSS因其层叠和继承的特殊性,并不适合像JavaScript或HTML那样拆分成多个独立文件,因为样式的声明顺序至关重要。他将过度拆分CSS文件比作“把一块玻璃丢在水泥地板上”。其次,他强烈批评了在Sass中使用深度嵌套,认为这会让本就可能混乱的CSS扩展出第二个维度的混乱,甚至引用了开发者Hugo Giraudel那句著名的“Fucking. Stop. Nesting.”。在单位使用上,他反对使用像素(px)进行布局,尤其是响应式设计中,倡导使用rem/em等相对单位,以便通过调整根字体大小轻松实现整体缩放。最后,他针对“设备断点”的做法提出质疑,认为响应式设计应针对“内容”在何处呈现不佳来设置断点,而非针对苹果、安卓等具体设备的屏幕尺寸。 总体而言,作者旨在提醒开发者:CSS有其独特的运行逻辑,不应简单套用其他语言的组织方式或死板地针对特定设备设计。真正的“响应式”应当服务于内容本身,并尊重用户对字体大小的偏好设置。

IT 2015-09-04 21:50:03 / 累计浏览 3,300

SQL 新手指南

这篇指南从“SQL无处不在”的现实切入,为零基础读者拆解了数据库与SQL的核心概念。作者将抽象的数据库比作更强大的Excel电子表格,清晰解释了表、行列、关系等基础元素,并用一个“电影台词”数据库作为贯穿示例,直观展示结构化数据如何被组织和关联。 文章的核心在于讲解SQL的四种基本操作(CRUD):创建、读取、更新和删除数据,这是与数据库沟通的基石。作者强调,尽管有各种可视化工具,但理解SQL语言本身至关重要——它语法接近英语,是一种声明式语言,掌握它能让你更高效、更灵活地解决问题。 整体而言,这是一份非常扎实的入门引导,不仅告诉你SQL是什么,更通过具体的表格实例,让你感受到关系型数据库如何将杂乱数据变为可高效查询的资产,为后续学习打下坚实基础。

IT 2015-07-23 13:52:57 / 累计浏览 1,420

为什么 IE 不支持(子)域名含有下划线

作者分享了一个让他“永远不会忘记”的调试经历:为什么在IE浏览器中,一旦(子)域名包含下划线,PHP的会话cookie就会完全失效,即使最新的IE11也不例外。 问题的根源追溯到一个2001年的安全补丁(MS01-055)。微软为修补早期漏洞,实施了非常严格的DNS名称校验,要求必须遵循早期的RFC标准(如RFC606/608)。而早期标准并未包含下划线这个字符,因此IE会拒绝设置任何域名部分含有下划线的Cookie。作者指出,微软在此可能混淆了“主机名”与更广义的“域名”概念,因为RFC2181已表明DNS协议本身对标签字符没有限制,但微软的严格校验成为了IE独有的“遗留问题”。 由于这是浏览器端的强制策略,对于开发者而言,唯一的解决方案就是在域名命名中主动避免使用下划线。作者最后抛出了一个观点:在坚持看似“正确”的标准与适应已经普遍接受的实践之间,浏览器厂商该如何选择?

IT 2015-07-23 13:40:38 / 累计浏览 2,080

拒绝修复 bug 的几个正当理由

这篇讲的是:在软件开发中,一味地、立即修复所有 bug 可能并非最佳实践。 作者从代码质量与项目长期健康度的视角出发,提出了四个可以“正当”拒绝 bug 修复的理由。首先,草率的修复常通过删除或跳过单元测试来让构建通过,这实质上降低了测试覆盖率,为系统埋下隐患。其次,一个合格的修复应包含能重现该 bug 的测试用例,否则只是掩盖问题,无法防止修复行为本身引入更多“熵”。再者,bug 修复应保持小而专注,避免与代码重构混杂在一起,否则会使补丁难以审查和理解。最后,一次 pull request 应只处理一个 bug,确保修改的纯粹性和可追溯性。 作者的核心观点是,bug 修复的纪律比程序员良好的重构意图更重要。有时,要求提交者完善测试、拆分补丁,是比简单合入代码更负责任的选择。文章通过具体的技术场景,为团队代码评审和维护流程提供了一套清晰的思考框架。

IT 2015-06-04 10:23:39 / 累计浏览 1,720

在白板上写代码是有难度的

这篇讲的是技术面试中那个让不少人头疼的环节:白板编程。作者从自己作为微软团队面试官的经验出发,给出了一个核心观点——面试官真正在考察的,并不是你能否当场写出语法完美无误的代码。 他理解白板没有智能感知和语法高亮,因此不介意你出现参数顺序错误这类“小瑕疵”。真正看重的是你的问题解决过程:是急于动手,还是先理清思路?是否主动识别并澄清了需求中的模糊点?会优先攻克难点还是先处理简单的部分? 文章以几个经典面试题(如实现栈、打乱数组)为例,点明了关键:很多问题本身就暗藏陷阱,比如字符串处理需要考虑不同编码,数组随机化要区分安全场景与测试场景。忽略这些“真实世界”的考量,代码设计就无从谈起。 作者鼓励应聘者,在编写代码时就要像开发者一样思考:如何测试?如何处理异常输入?代码是否健壮、可维护?他认为,展现出这种工程思维,远比纠结于一时的语法记忆更能证明你的潜力。最后他也坦言,技术面试本就艰难,聪明如他也曾被拒,这本身就是一个值得准备的过程。

IT 2015-06-02 13:17:58 / 累计浏览 2,420

用 JS 复制艺术

这篇讲的是作者如何用 JavaScript 来模仿著名艺术家草间弥生的点画作品《无限网》。作者首先细致观察了原作,发现其特点在于圆点大小不一、带有扭曲且互不重叠,整体呈现出一种有序的流动感。 核心实现思路相当巧妙。作者没有追求像素级的完美复制,而是选择用最基础的循环和数学函数来近似。通过嵌套的循环遍历画布的像素坐标,利用正弦与指数函数的组合来计算每个圆点的位置与半径,并加入了随机偏移来模拟手绘的不规则感。仅仅几十行纯 JavaScript 代码,就生成了视觉上高度接近的波点图案,展现了代码生成艺术的简洁与强大。 文章最终呈现的效果令人印象深刻,不仅是一个有趣的技术试验,也证明了用简单算法可以逼近复杂的艺术效果。文末还附上了社区用户更精确的实现方案,体现了技术实现的多样性与迭代可能。

IT 2015-05-29 19:55:50 / 累计浏览 1,720

我的移民故事

这篇讲述的是一位俄罗斯程序员移民美国、并最终创业的真实历程。作者从2005年通过暑期工项目登陆华盛顿当救生员学英语开始,经历了远程实习、多次H-1b签证抽签失利,为维持合法身份而就读巴布森学院MBA。期间他先后在波士顿小公司、诺基亚和硅谷初创公司工作,始终在“为雇主工作”与“渴望创业”的移民政策夹缝中寻找出路。转折点出现在一次看似幸运的绿卡抽签中,但背景调查又与失业时间重叠,几乎将他推向绝境。最终在2012年,他抓住时间窗口创立了Datanyze。 文章不仅是一段个人奋斗史,更通过亲身经历揭示了美国移民制度与创新生态之间的矛盾——H-1b签证限制人才流动,缺乏企业家签证使得许多创业者无法在美开公司。作者在文末明确呼吁推出企业家签证,认为现行制度未能充分利用外来人才驱动经济。对于技术从业者而言,这个故事提供了关于职业规划、签证风险与创业时机的宝贵参考。

IT 2015-05-11 23:41:02 / 累计浏览 7,000

Ruby 和 Python

这篇讲的是编程语言圈里的经典对决:Ruby与Python。作者从个人经历出发,先分别概括了两种语言的核心气质——Ruby像一位充满“魔法”的创造者,由Yukihiro Matsumoto在1985年创造;Python则更直接明了,由Guido Van Rossum在1991年创建。 文章用一张对比表清晰列出了它们的优缺点与生态:Ruby的优势在于海量现成的Web开发功能和拥抱新事物的速度,但调试可能是个挑战;Python则以易学和强大的社区(尤其在学术界与Linux环境)见长,只是代码有时会显得过于直白。在Web框架层面,Ruby有著名的Rails,Python有Django,两者都是各自阵营的旗舰。 作者特别结合自己从Django转向Rails的四年实战经验,指出了两者在语言和框架层面的关键差异。最后,通过列举Apple、Twitter、Github等巨头选择Ruby,以及Google、Instagram、Mozilla等拥抱Python,文章揭示了一个现实:技术选型没有绝对的胜负,而是取决于团队目标、项目需求和开发者的偏好。这为纠结于选择的读者提供了一个务实的参考视角。