惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
GbyAI
GbyAI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
美团技术团队
NISL@THU
NISL@THU
C
Cisco Blogs
SecWiki News
SecWiki News
N
Netflix TechBlog - Medium
Forbes - Security
Forbes - Security
Cloudbric
Cloudbric
雷峰网
雷峰网
T
Tailwind CSS Blog
博客园 - 司徒正美
The Register - Security
The Register - Security
L
LangChain Blog
S
Security Affairs
Hacker News - Newest:
Hacker News - Newest: "LLM"
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Threat Research - Cisco Blogs
I
InfoQ
S
Schneier on Security
L
Lohrmann on Cybersecurity
量子位
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Martin Fowler
Martin Fowler
Schneier on Security
Schneier on Security
F
Fortinet All Blogs
TaoSecurity Blog
TaoSecurity Blog
K
Kaspersky official blog
Google DeepMind News
Google DeepMind News
Cisco Talos Blog
Cisco Talos Blog
PCI Perspectives
PCI Perspectives
Attack and Defense Labs
Attack and Defense Labs
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
H
Help Net Security
Project Zero
Project Zero
The GitHub Blog
The GitHub Blog
D
Docker
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
H
Hacker News: Front Page
云风的 BLOG
云风的 BLOG
Microsoft Security Blog
Microsoft Security Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
Webroot Blog
Webroot Blog
MongoDB | Blog
MongoDB | Blog

Mobility

从薅 token 到管 skill:我的 pks 工具落地实践 把笔记、微信读书、知乎装进 Obsidian:我基于llm-wiki知识中枢搭建实录 免费AI视频生成器:我如何用零成本做出带旁白字幕的多场景AI视频 Agnes免费模型真能白嫖视频?我改造了ViMax来试试 教你薅token(二):构建agent无关的skills管理工作流 教你薅token:构建agent无关的AI工作流 用 AI Agent 完成 Hexo 主题迁移:从 Next 到 Butterfly 的全自动化实践 Vercel封禁163邮箱后,我是怎么恢复博客的 用LLM管理安全开发规范:一次llm-wiki实践 Vaadin框架教程:Java工程师的前端开发秘籍 hexo多语言方案总结及最佳实践 知乎增强工具-评论时间精确到秒 怎么理解数据库的四个隔离级别 kubernetes是什么-实用向教程 怎么更科学的用知乎摸鱼 读书笔记《系统之美》,如何面对现实中的复杂问题 分布式系统设计中的通用方法 高并发解决方案很难吗?轻松聊清楚高并发设计 SSP,DSP,RTB,ADX都是什么? 讲讲互联网广告的概念与发展 从redolog,undolog到隔离级别,刨根问底,讲清楚事务和ACID java项目低学习成本使用kubernetes的实践经验 剧变中的2021-一个中年工程师的年终总结 kubernetes环境下做金丝雀发布的一种思路 prometheus教程: 一篇文章讲懂prometheus 实现一个简单的java版本高性能获取ip地址所属国家工具 iterm2配置ssh书签, 实现记住密码和自动登录 怎样做一个好的技术分享 云原生究竟是什么 读书笔记 稻盛和夫《干法》-思考应该怎样去工作 review的个人价值 户口?大厂?高薪?生活?聊聊应届程序员的职业选择 RPC接口将所有输入输出封装成类是合理设计吗 程序员做业务开发的价值 设计模式的原则,设计模式究竟是什么 我提升开发效率的经验 通过合理的设计降低软件开发复杂度 信息传播过程中的衰减 看房小记-2020北京学区 读书感悟:文明、现代化、价值投资与中国 读书笔记-我曾走在崩溃的边缘 [翻译][关于分布式架构和系统设计]分布式系统的模式-综述 redis的对象 redis里的数据结构 设计模式备忘录 通过mysql批量操作不生效问题聊聊java里mysql的batch 【实践经验】单元测试怎么写 关于rocketmq的readQueue和writeQueue 数据分析的利器-clickhouse介绍 通过位运算转换大小写 activemq多线程消费的不同处理方式 高并发下作余额扣减的一些经验 java细节:三目运算符和自动拆箱 设计一个开源的北京地铁路线规划小工具 java版本 redis cluster的数据迁移 jstorm源码解析之循环任务AsyncLoopThread activemq特性之持久化 activemq的安装及基本使用 activemq系列-概述 hexo教程:博客系统搭建及部署到github jstorm的监控metrics数据输出到第三方存储介质 camel系列之camel debugger的使用 jstorm源码解析之bolt异常处理 log4j动态添加appender 【翻译】java里编写基准测试的一些经验 java线程池:获取运行线程数并控制线程启动速度 maven里的mirror和repository: 配置多repository 使用maven shade plugin 打可执行Jar包 activemq plugin开发指南及示例 通过加入classpath的形式实现命令行运行java程序时引入第三方jar包 解决fatjar的 “java.lang.SecurityException: Invalid signature file digest for Manifest main attributes” 问题 通过实际操作理解redis cluster原理 一种实现在hbase中存储set的思路 log4j2.xml配置示例及与log4j的区别 不实现equals方法的情况下比较java list 使用lua脚本和jedis实现redis的hmsetnx命令,操作hash表时不覆盖原有数据 vitualbox虚拟机安装centos 7 及ssh访问、自启动等配置 在java独立进程(standalone app)中嵌入hawtio监控 java日志系统简介: 从tomcat大量打印debug日志说起 Java kryo/protobuf/protostuff序列化 or Json 性能对比 java分布式锁入门实战 leetcode第三题: 输出不包含重复字母的最长子串 java多线程实现三个字母顺序输出 一次kafka空间激增排查:kafka的数据压缩、批量发送等 java里128有何魔力? 聊聊Integer的缓存 storm/jstorm生态与周边工具,storm连接activemq,kafka,hdfs等 jstorm UI 介绍 五分钟学会写storm代码: jstorm/storm编码原理与普通java程序的区别 activemq web console的权限配置 storm ui 中一些关键属性的含义 activemq 5.6 连接池的内存泄露问题 关于apache camel的消息转发效率 一篇不错的lda模型入门文档 wordcount代码 hadoop基本的学习资料
聊聊程序员的职业生涯,我对程序员这个职业的理解
流沙 · 2020-03-18 · via Mobility

工作这些年来,一直在思考着程序员这个职业究竟是在做什么,随着经验增多,其实也一直在刷新着认知。现在写这篇文章,一方面是为了分享,另一方面也是想留下一份记录,过两年再回头来看看自己的认知又有了什么更新。

我想从两个方面来说。一是从做的事儿上,在我看来,程序员的工作就是发现问题、分析问题、解决问题三类。事实上,世界上绝大多数工作都可以囊括进这三类事中。二是从能力上来看,我把能力分为两种:对现实世界的认知能力,和将现实世界映射成程序语言的能力。

对于三种类型的事,按发现问题,分析问题,解决问题的顺序,是从宏观到细节的区别,平时做的事,肯定是以解决问题为主,各种琐碎的事,也都是在解决问题。发现问题和分析问题对人的思维深度会有更高的要求,不过对于工作来说,我倒并不觉得这三类事有什么高下之分。如果对确定的问题,总能给出恰当的解决方案,这也是职场上非常硬核的核心竞争力。而对于两类能力,一般还是更关注第二种。但是我觉得对现实世界的认知能力,对于程序员的职业发展是非常重要的。就像抠业务,抠CRUD这事,有门槛吗?我觉得是有的,至少把业务做的很好门槛非常高。有些人总是以非常奇特的方式去实现业务,然后赖产品经理需求描述不清楚,很可能就是缺少对现实的认知。

接下来,就按发现问题、分析问题、解决问题的顺序,分别详细说一下。

发现问题的能力,对程序员来说,其实不是必需的。很多问题,即便你发现不了,或者发现了然后假装它不存在,系统一样可以运行的很好。但是,逐步的累积这种问题,最终必然会导致代码不可维护。下面,我拿一个自己的实际经历来举个例子。之前做过一个旅客飞行记录的项目,国内航班的数据,我们几乎都能拿到。数据存储的时候,主键是用的证件号,为什么呢,因为所有的订票系统,都是用证件号去做key的。但是我们的产品形态并不是这样,而是以用户的维度去显示,一个用户会有多个证件。这样就导致了一个问题:任何一个非常简单的问题,比如要查用户最近一条飞行记录,最近十条飞行记录,都会有一套复杂的处理流程。更不用说随着数据量增加,要分库分表,但同一个用户的证件没法往一张表上落,逻辑复杂度再提升一级。在这个时候,不发现这个问题,其实业务也完全开展的下去,但是很显然,做这块业务就会做的很难受。而意识到这是个问题,再做相应的调整后,才会发现原来这一块的业务如此简单。

那么,怎么才能发现问题呢。这需要我们有对现实世界的认知能力,也需要对设计模式等基础知识有足够的理解。要发现问题,我们首先得有“正常状态”是什么样子的概念,与正常状态不一样的,就是问题。比如前边的例子,一个“正常状态”是查询用户最近的飞行记录,这个需求应该非常简单,还有一个“正常状态”是我们的用户是一个人,而不是一个证件,发现了和政策状态不一致,也就发现了问题。再举一些例子,写单元测试应该是很简单的,当发现单元测试不好写的时候,就需要考虑一下是不是代码的设计出了问题;mysql的一次batch请求,耗时的数量级应该在毫秒级, 而且数据量不应该严重影响耗时,当发现数据量和耗时的关系成了一个非常陡的线性关系,就要考虑一下是不是真的做了次batch(参考 https://lichuanyang.top/posts/63688)。

接下来是分析问题。对于分析问题,我觉得说白了就是把一个表现出来的问题,拆解成一个或若干个“指标”出了问题。这些“指标”,可以是内存、cpu这样实际的指标,也可以是一些基本的概念理解、设计思路。还是上一个例子,我们发现的问题就是一些很简单的需求实现起来很难,最后拆解出来的出问题的“指标”就是存储记录主键的选择。

对于分析问题,要会做合理的可能性推测,然后多利用工具验证或者推翻猜测。之前有一次发现数据存不进数据库,这时候就可以做出若干个合理的推测:数据库本身有问题;和数据库的连接有问题;事务未能正常提交;逻辑错误导致数据未能生成;等等。然后去翻日志,看有没有报错,看Mysql监控,有没有大量未能提交的事务。逐步就定位到问题了。

最后说解决问题,对大部分程序员来说,这个一直会是做的最多的事。而程序员的解决问题,也就是把现实中的概念在计算机中表示出来。其中最关键的,我理解有两个,一是分解任务,把一个大任务拆分成若干个独立的子任务;二是迅速的理解并使用新工具能力,也就是持续学习的能力。很多人会经常抱怨程序员要学的东西太多了,学不过来了。不过一定要注意哪些东西是值得花费大量时间去学的,哪些东西是简单看看就足够了的。发现有很多人热衷于工具的学习,喜欢写各种版本的Hello World, 这个在我看来就是无效的学习。编程方面的学习,需要兼顾深度和广度,深度,是需要非常透彻的研究一些技术,这个看了一些之后,你会发现各种技术,看起来可能没什么关系,比如数据库和消息队列,但是其中就是会有非常多相似的概念和思想。学过一些之后,就可以建立起自己的知识体系了,然后再去学其他的东西,就会非常快。

因为一个新技术的产生,必然是迫切的要解决一些实际问题。比如为什么会有clickHouse, 因为mysql等的按行存储不适合数据分析,而市面上又没有性能、稳定性都比较好的列存储数据库。再比如jedis直接连redis-server, 在多线程环境下表现不好,所以有了Lettuce。当知道要解决什么问题后,就可以先试着想一下换成你的话,有什么解决方案。然后再去看看人家实际的解决方案。如果方案很接近,那么恭喜你,你对技术的理解已经又上了一个高度。如果不一样,那也恭喜你,又学到了一种新的思想。这些思想,在以后做业务的时候,随时都可以化用。

共勉。

原文地址: https://lichuanyang.top/posts/27398/