十年很短,编程很难_一位哲学家问一个正在砌砖的泥瓦匠,有些人知道他们正在建造一座大教堂,而其他(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

  • 合适的编程语言:当前编程语言的推荐写作风格是否被采用?语言特性和语法糖是否得当使用?
  • 易于修改:代码设计是否考虑了未来的需求变化?发生更改时,代码是否容易相应修改?
  • 合理的API设计:API设计是否合理且易于使用?一个好的API在简单场景中使用方便,在高级场景中根据需要可以扩展
  • 避免过度设计:代码是否受到过度设计和过早优化的问题?
  • ……

简而言之,好的代码不是程序员在任何水平上都能轻松获得的东西。写好代码需要在许多方面进行反复权衡和慎重设计,最终进行不断的打磨

那么,如果你想迅速掌握编码的技艺,有没有什么捷径呢?

提升编码技能的捷径

在许多层面上,我认为编程和写作非常相似。两者都使用文字和符号来表达思想,只是表达的方式略有不同

说到写作,我想问一个关于作家的问题:“你曾听说过一个作家不读书吗?你曾听说过一个作家说他从不读别人的作品,只读自己的吗?”我猜答案应该是否定的

如果你查找相关信息,你会发现许多专业作家的日常生活都围绕着阅读和写作。在开始写作之前,他们每天花费大量时间阅读各种文本

同样作为“文字工作者”,程序员往往忽略了阅读。然而,如果我们想迅速提高我们的编程技能,阅读是不可或缺的一部分。除了我们在日常工作中遇到的项目之外,我们还应该多读一些经典的软件项目,并从中学习API设计、模块架构和代码编写技巧

不仅是代码和技术文档,定期阅读一些与计算机相关的专业书籍也是推荐的,以保持阅读书籍的习惯。在这方面,我认为Jeff Atwood在15年前写的一篇名为“程Programmers Don’t Read Books – But You Should”的文章今天仍然具有相关性

提高编程技能的捷径在于“阅读 <-> 编码”之间的无尽循环

2. 编程的本质是“创造”

在程序员的日常工作中,许多事情都能带来成就感,甚至使人惊叹“编程是多么美妙”。例如,修复一个难以定位的错误,通过使用新算法提高代码性能等。但在所有这些事情中,没有哪一样能比“用自己的双手创造出某物”的感觉更棒

在编程时,创造新事物的机会随处可见。这不仅仅涉及发布新软件。编写可重用的实用函数或设计清晰的数据模型也可以被视为“创造”

作为程序员,保持对“创造”的热情至关重要,因为它可以帮助我们:

  • 更高效地学习:学习新技术的最有效方式是使用它开发一个真实的项目,在创造过程中学习会取得最好的结果
  • 偶然遇到一些不同寻常的事情:许多改变世界的开源软件项目最初都是作者纯粹出于兴趣创建的,比如Linus Torvalds和Linux,Guido van Rossum和Python。

尽管“创造”有很多好处,程序员有充足的机会去创造,但很多人常常缺乏“创造者”的意识。就像一个广为流传的故事说的那样:一位哲学家问一个正在砌砖的泥瓦匠,有些人知道他们正在建造一座大教堂,而其他人认为他们只是在铺砖。许多程序员“只看到砖块,而没有看到大教堂”

一旦将自己定位为创造者,对事物的看法将发生翻天覆地的变化。例如,在为API添加错误提示文本时,创造者可以摆脱“只是快速满足需求”的思维陷阱,向前迈出一步,提出更重要的问题:“我想为用户创造什么样的产品体验?什么样的错误消息会帮助我实现那个目标?”

就像任何有用的编程模式一样,“创造者思维”也可以成为你职业生涯中的巨大推动力。因此,现在试着问问自己一个问题 — “我的下一个创作会是什么呢?”

3. 为高效的试错创造环境至关重要

我曾参与开发一个设计精美、功能丰富,每天有大量用户使用的互联网产品

然而,尽管从市场的角度来看,这是一个成功的产品,但其工程质量非常糟糕。如果你打开它的后端项目并把所有目录颠倒过来,你根本找不到任何单元测试代码,更别说其他自动化测试流程了。而且,业务逻辑非常复杂。最终,项目代码之间存在着意想不到的耦合,就像牛背上无数的毛发一样。开发一个新功能很容易破坏旧的功能

在这里插入图片描述

因此,每次项目发布时,开发团队和产品团队都必须保持高度警惕,创造一种非常紧张的氛围。整个发布过程也非常惊心动魄,紧急回滚时有发生。在这样的环境中工作,不仅促进了技术的成长,而且无疑地考验了一个人的心理韧性

编程原本是一份有趣的工作,但是为这样的项目编程却消除了任何愉悦感。究竟是什么夺走了编程的乐趣呢?

理想的编程体验 ≈ “刷题”

LeetCode是一个著名的编程学习网站,提供许多涵盖各种难度的编程问题,其中大多数与算法有关。用户可以选择他们感兴趣的问题,直接编写代码(支持几十种编程语言),并在浏览器中执行。如果所有测试用例都通过,就被认为是一个成功的解决方案。

在这里插入图片描述
在 LeetCode 上解决问题就像玩游戏一样,充满挑战和乐趣。整个解决问题的过程完美地展示了理想的编程体验:

  • 关注点分离:每个问题都是一个独立的实体,让开发人员能够一次完全沉浸在一个问题中
  • 快速准确的反馈:开发人员可以通过自动测试快速获得代码调整反馈
  • 零成本试错:编写有语法错误或逻辑问题的代码不会产生任何不良后果,从而减轻了心理负担

不过,你可能会认为我在屏幕前胡说八道

"还有什么?解决算法问题、编写小脚本,不都是一样的体验吗?"你可能会继续补充:“你知道我们公司的项目有多复杂吗?它们规模庞大,模块众多。我们每天为数百万人提供服务。我们有多套数据库和三种类型的消息队列。当然,开发工作会很麻烦!”

的确,世界各地的软件开发工作千差万别,不可能所有项目都像在 LeetCode 上解决问题那样轻松愉快。但是,这并不意味着我们不应该努力改善我们的编程环境,哪怕只是一点点

可用于改善编程体验的概念和工具包括

  • 模块化思维:正确设计项目中的每个模块,降低耦合度,增强正交性
  • 设计原则:在微观层面,应用经典的设计原则和模式,如 "SOLID "原则
  • 动化测试:编写标准化的单元测试,必要时使用 Mock 技术,并通过自动化测试覆盖关键业务路径
  • 缩短反馈回路:改用更快的编译工具,优化单元测试性能,尽一切可能缩短从 "修改代码 "到 "获得反馈 "的等待时间
  • 微服务架构:必要时,将单体系统拆分成多个具有不同职责的微服务,以分散复杂性

关注编程环境,刻意营造 “代码天堂”,允许高效试错,让工作像解决问题一样轻松愉快。这是经验丰富的程序员能为团队做出的最佳贡献之一

4. 避免陷入代码完美主义的陷阱

对代码质量精益求精是好事,但也要注意不要陷入完美主义的陷阱。因为编程不是艺术创作,它不鼓励人们无限追求完美。作家可以花数年时间打磨一部杰作,但程序员如果过于专注于代码,就会出现问题

世界上没有完美的代码。大多数时候,只要你的代码能满足当前的要求,并为将来的扩展留有余地,就足够了。有几次,我看到应聘者在简历上给自己贴上了 "代码强迫症 "的标签。隔着屏幕,我能感受到他们对代码质量的重视,但在我内心深处,我希望他们把完美主义的陷阱远远抛在脑后

5. 技术固然重要,但 "人 "可能更重要

在软件开发领域,“单一责任原则”(Single Responsibility Principle,简称 SRP)是一个非常著名的设计原则。它的定义很简单,可以用一句话概括:“每个软件模块应该只有一个改变的理由”

在这里插入图片描述
要掌握 SRP 原则,关键是要了解 "修改的原因 "是什么。程序没有生命,无法主动改变自己。修改程序的任何原因都来自与程序相关的人,而人是修改程序的罪魁祸首

举个简单的例子。以下两类程序中,哪一类违反了 SRP 原则?

  • 字典数据类,支持两种类型的操作:存储数据和检索数据;
  • 一个雇员档案类,支持两类操作:更新个人信息和渲染用户档案卡图像。

在大多数人看来,第一个例子没有问题,但第二个例子却违反了 SRP 原则。要得出这个结论,似乎不需要严格的分析或证明,只需运用一点直觉即可。然而,如果我们认真分析一下,就不难发现修改第二个例子有两个不同的可疑理由:

  • 经理认为数据中的 "个人电话号码 "字段不应包含非法数字,因此需要添加简单的验证逻辑
  • 员工认为个人名片图片上的 "姓名 "部分太小,希望增加字体大小

“要求更改的是人。你不想把许多不同的人出于不同的原因而关心的代码混在一起,从而使这些人或你自己感到困惑”。- 单一责任原则

理解 SRP 原则的关键在于首先了解人以及他们在软件开发中扮演的角色

这里还有一个例子。微服务架构是近年来的热门话题。然而,很多人在讨论时往往只关注技术本身,却忽略了微服务架构与人之间的关系

区分微服务架构风格的关键在于,将单体系统拆分成独立的微服务后,不同模块之间的界限会变得更加清晰。与数百人的团队维护单体系统相比,许多维护独立微服务的小型组织具有更高的运营效率

如果缺乏特定的组织规模(即 “人”)作为前提,谈论微服务的各种技术优势和那些花哨的技术就会完全错位

技术当然重要。作为专业技术人员,那些华丽的架构图和巧妙的代码细节自然会吸引我们的注意力。但是,请不要忽视软件开发中的另一个重要因素–“人”。必要时,改变一下视角(从 "技术 "到 “人”),这将使你受益匪浅

6. 渴求知识是好事,但也要注意方法

现在大家都在讲 “终身学习”,而程序员是一个特别需要终身学习的职业。因为计算机技术的迭代和更新是非常快的,三年前流行的框架或编程语言,很可能一个月前就已经过时了

在这里插入图片描述
要想在工作中表现出色,程序员需要学习的东西很多,涉及方方面面。以我比较熟悉的后端领域为例,一名合格的后端工程师至少需要掌握以下内容:

一种或多种后端编程语言/关系数据库(如 MySQL)/常用存储组件(如 Redis)/设计模式/用户体验/软件工程/编译器原理/操作系统/网络基础知识/分布式系统/…

虽然要学的东西很多,但据我观察,大多数程序员都喜欢学习(或至少不排斥学习),因此心态不是问题。不过,有时仅有 "求知若渴 "的心态是不够的。学习时尤其要注意 “性价比”

注重学习的成本效益

下图展示了学习效果与投入之间的关系

在这里插入图片描述
从图中可以看出,在学习的早期阶段,当输入量较少时,学习效率会迅速提高。然而,一旦学习效率超过某个临界值,进一步提高学习效率所需的学习输入量就会呈指数增长

正因为如此,我建议大家在学习新知识时,首先要在头脑中想清楚:"我应该在图形的哪个位置停下来?"而不是盲目地学习

知识的海洋浩瀚无边,有些东西需要几个月甚至几年的持续学习和不断提高,也有一些事情,掌握肤浅的知识就足够了。准确评估和分配自己有限的学习精力,比努力学习更重要。

选择合适的学习材料

确定了学习目标,下一步就是寻找合适的学习材料。在这方面,我想与大家分享一个失败的亲身经历

有一段时间,我突然对产品交互设计产生了浓厚的兴趣,认为自己应该在这方面有所提高。于是,我精心挑选了一本该领域非常经典的专业书籍:《About Face 4: The Essentials of Interaction Design》,并满怀信心地把它带回了家,相信自己的交互设计能力一定能很快得到提高

然而,事与愿违。当我捧起那本经典著作时,却发现自己连第一章都无法顺利读完–正所谓 “转行如过山车”

从这次失败中,我总结了一些经验。那就是在学习新知识时,我们最好选择那些更容易阅读、更适合初学者的教材,而不是一味地追求最经典、最权威的教材,不考虑自己的水平

回顾以往的经验,我认为以下几本书非常适合初学者学习,而且物美价廉:

  • 《The Non-Designer’s Design Book》:设计相关
  • 《Don’t Make Me Think》:网络用户体验相关

也许每个人的内心都渴望成为一个知识渊博、无所不知的人。然而,可供分配的时间和精力总是有限的,我们无法也没有必要成为所有领域的专家

7. 越早开始编写单元测试越好

我喜欢单元测试。我相信,编写单元测试对我的编程生涯产生了巨大的影响。夸张一点说,如果以 "开始编写单元测试 "为分界线,我职业生涯的后半段要比前半段精彩得多

编写单元测试有很多好处,比如可以推动代码设计的改进,还可以作为代码的一种文档形式等等。此外,全面的单元测试对于创造一个可以高效犯错的环境也至关重要

我曾写过几篇关于单元测试的文章,如《关于单元测试的 5 条建议》和《《Celeste》游戏教会了我编程原理》。我只想说:如果你还没有尝试过编写单元测试,或者到目前为止对测试还不太重视,我建议你从明天开始做起

在这里插入图片描述

8. 程序员最大的敌人是什么?

在大多数程序员笑话中,产品经理往往以对立的角色出现。他们口中的项目需求总是不断变化,每天都有新的想法冒出来,这让程序员们非常沮丧

在这里插入图片描述
在这些笑话的背景下,不断修改需求的产品经理似乎成了程序员最大的敌人。似乎只要产品不修改需求,大家的工作环境就会立刻变成乌托邦

虽然偶尔拿产品经理开开玩笑很有意思,但我还是想严肃地说一句:产品经理不是敌人

因为从某种角度看,软件生来就是用来修改的(否则,你猜它为什么叫 "软件 “?)从这个意义上说,开发软件与建造房屋完全不同。因为没有人会在完成一栋建筑后说"我们把它拆了重建吧!同样的建筑,但钢筋水泥要少 30%!”

为了做好运维面试路上的助攻手,特整理了上百道 【运维技术栈面试题集锦】 ,让你面试不慌心不跳,高薪offer怀里抱!

这次整理的面试题,小到shell、MySQL,大到K8s等云原生技术栈,不仅适合运维新人入行面试需要,还适用于想提升进阶跳槽加薪的运维朋友。

本份面试集锦涵盖了

  • 174 道运维工程师面试题
  • 128道k8s面试题
  • 108道shell脚本面试题
  • 200道Linux面试题
  • 51道docker面试题
  • 35道Jenkis面试题
  • 78道MongoDB面试题
  • 17道ansible面试题
  • 60道dubbo面试题
  • 53道kafka面试
  • 18道mysql面试题
  • 40道nginx面试题
  • 77道redis面试题
  • 28道zookeeper

总计 1000+ 道面试题, 内容 又全含金量又高

  • 174道运维工程师面试题

1、什么是运维?

2、在工作中,运维人员经常需要跟运营人员打交道,请问运营人员是做什么工作的?

3、现在给你三百台服务器,你怎么对他们进行管理?

4、简述raid0 raid1raid5二种工作模式的工作原理及特点

5、LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?

6、Squid、Varinsh和Nginx有什么区别,工作中你怎么选择?

7、Tomcat和Resin有什么区别,工作中你怎么选择?

8、什么是中间件?什么是jdk?

9、讲述一下Tomcat8005、8009、8080三个端口的含义?

10、什么叫CDN?

11、什么叫网站灰度发布?

12、简述DNS进行域名解析的过程?

13、RabbitMQ是什么东西?

14、讲一下Keepalived的工作原理?

15、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
5、讲述一下LVS三种模式的工作过程?

16、mysql的innodb如何定位锁问题,mysql如何减少主从复制延迟?

17、如何重置mysql root密码?

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
[外链图片转存中…(img-Ej76bl1a-1713226830997)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 20
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值