来自:初码 – 博客园 作者:张柔 链接:http://www.cnblogs.com/printhelloworld/p/5698984.html (点击尾部阅读原文前往) 已获转载授权 文章《 浅谈程序员的英语学习 》中的观点我非常认同,英语是非常重要的,但文章站的高度还是太高,具体表述的学习方法我不是很认同,也认为不太实际,今天就借此机会和大家很认真的谈一谈程序员的自我修养问题
先介绍一下利益相关,我的背景: 初中开始参加信息学与数学竞赛,大学本科软件工程专业,毕业后在银行做大数据分析与项目管理,后自主创业,做过传媒公司、软件外包公司,现在中国(南京)软件谷有个工作室,做些自己喜欢的事情
15年编码经验,6年创业经验
主要技术方向是.NET、HTML5、云服务、应用级开发等,自我整体水平评价为,资深程序员、初级架构师 首先要谈的是,今天的话题所聊的程序员包含哪些人? 在说之前,不得不提到一个很有名的程序员赵劼,他有过一个观点:“坚决反对北大青鸟等机构”,以前我也很赞同这个观点,但是现在,我在“赞同的基础上”,又坚决反对甚至反感赵劼们“发表这种观点”
因为这种观点,能够帮助并作用到的人群,是赵劼们最不可能遇到的基层开发人员,而这些最不可能遇到的人,却恰恰是在中国的最普遍的程序员,他们也是赵劼们最不可能甚至不太愿意帮助的人
如果一个高阶程序员,自恃理科基础好,逻辑性强,有过完整的语言学习经历,就认为至少达到这样才是程序员,甚至觉得其他的不学数据结构的人就不要做程序了,那真是非常的妄自菲薄
在中国,写程序,不仅仅是一种兴趣,更多的时候,还是一种普通职业和谋生工具 大公司有厉害的程序员,优秀的架构师,但大量的小公司也有很多普通的程序员
在我这些年的工作经历中,也越来越深刻的感受到普通程序员的影响和力量
对于高阶程序员,所谓八仙过海各有神通,各有各的成就,各有各的修养,但程序员在达成较高的水平之前,有一些“自我修养”,是最基础的,是普世的
所以今天的话题面向的程序员,就是所有的正在写代码或者曾经写过代码的程序员,也包括广义上的程序员,例如项目经理、架构师等等
2、程序员小张进公司3个月了,老板布置了很多任务,他觉得老板很没人性,工资给的不高,加班也不给钱,于是在写代码的时候能省就省,客户反馈有问题也不主动解决,敷衍为主,又过了一个月,跳槽了
3、程序员小张正在写一个功能模块,需要进行某种加密,到百度搜到了一个编码模块,看不明白具体写了什么,但是放到程序里刚好适用,于是就这么原封不动放进去了
4、程序员小张要对某个功能进行研发,项目经理对他说,这个功能应该能搜索到,你去搜搜看,小张就在百度搜啊搜,一天过去了啥都没找到,项目经理来到小张身边坐下,换了个关键词,1分钟就搜到了解决方案
5、程序员小张学.NET已经工作3年了,工资还是10000,和公司提涨工资也没答应,想跳槽又犹豫,这时某个前辈对他说,你去看书吧,多看一些书,例如 《Visual C# 从入门到精通》,《CLR via C#》《Javascript权威指南》等等,于是小张买回来了, 随手翻了翻发现有些东西是他已经会的,有些看不懂的好像又用不到,而且书这么厚,要不要浪费时间去看呢?小张就这样反复纠结了半年,依然每天上班工作,下班LOL,偶尔还抱怨一下工资低
6、程序员小张到了一家新公司,在做一个项目实现某个功能时,想起来以前做过这样的功能,可是竟想不起怎么实现了,于是就到自己电脑上找文档,找了好久也没找到,只好放弃,最后又折腾了2天,终于还是把这个功能给实现了
就这样,在一片骂声中,几个程序员心情舒畅了,小张开心的去玩王者荣耀去了
我想,有些人可能已经明白我要说什么,有些人可能还不明白,具体的话我也说不出来,只能用一句话来概括就是: 在编写代码的过程中,善于学习、掌握方法、勤加思考、勤奋努力、持之以恒,长此以往,在编程中,你会发现不一样的自己
以上这些还是比较抽象,那么 提升自我修养的具体方法有哪些? 程序员具体如何达成“较高的修养”,每个人各有自己的办法,我无法说到很细,就和如何提高做人修养一样,一句两句话是说不清楚的,但是有些说法也通俗易懂,比如一个小孩,有教育良好的父母,父母彬彬有礼,小孩从小开始接受正规教育,小学、初中、高中、大学,然后文化课程和社会实践良好,那么这个小孩最终的做人修养,一定比没有经历过这个过程的小孩更好一些
同样的,写程序也是如是,下面我就讲一些最基本的、最浅显易懂的学习方法和道理,我把它叫做: 程序员基础的基础 一个好的开发人员,应该能够全面、高效、严谨的去处理任何软件程序和业务问题,成为一个好的开发,是一个很有意思的话题,不过无论这个话题如何开展,基础两个字必不可少,虽然代码量是衡量开发能力的重要指标,但仅能够熟练的进行代码编写是不够的,更要能深刻的理解技术原理和业务逻辑,扎实的个人基础和技术基础往往会促进代码的编写,更游刃有余的解决问题
下面说的一些基础,可能绝大部分开发人员都不会在意甚至忽略,但恰恰这些才是开发大厦的基石
1、科学基础 成为开发人员的过程不尽相同,有的是科班出身,有的是兴趣爱好,还有的是专业机构的培训,在这个过程中,可能全面或者零散甚至没有学习过计算机基础学科,但无论是哪一种,想要成为更高层次的开发人员,写出更高质量的代码,计算机基础学科的学习,是非常非常非常(重要的事情说三遍)重要的
具体的来说,基础学科在实践应用中,有如下几门是一定需要的,按照学习顺序排列如下 1)数据结构 数据结构课程通俗的说就是告诉你如何用最基本的语言类型、变量,关键词语句等,去处理各式各样的逻辑问题,我们称之为算法,而日常编程中的各种问题,例如排序、文件夹遍历操作、数据库查询等,都可以在数据结构课程中,找到对应的数学原型
数据结构课程的理解能力,也是一个人数学能力的体现,数据结构学习的好坏,是程序员水平差异的一个重要分水岭,对于这一块内容的学习,有如下建议:使用VB、C、C++、Pascal等语言,买一本相关语言数据结构与算法的书,或者在网上下载相关的PDF电子书,完整的学习一边,并将书本中的所有案例亲自编写运行调试一遍,当能够领悟到某些日常编程中常见手法源于某些数据结构和算法时,就基本达到了学习效果
2)操作系统 所有编程语言的开发以及应用的运行,都基于操作系统,桌面编程中的大部分场景包括内存、进程、文件系统、网络通讯、用户界面等,都源于操作系统的定义和概念,完整的了解操作系统的起源和组成以及运行逻辑,对多线程、复杂界面、文件管理以及一些难以正常理解编程思路等开发中遇到的场景,有非常大的帮助,不仅帮助理解,也能掌握更多有效的程序写法
具体可以买一本操作系统的书或者下载相关PDF电子书,完整的浏览一遍,做到能够结合实际编程场景来看待操作系统原理,就基本达到了学习效果
3)数据库 传统的关系型数据库,入门简单,深入却难,往往开发人员能够较快的掌握增删改查、视图、索引、存储过程等基本数据库操作,却在编写复杂查询、设计主外键、优化字段、去除冗余等时,出现只会依葫芦画瓢却不能自主思考扩展的状况
究其原因还是没能了解关系数据库的根本原理,而数据库这一门课程,系统的阐述了关系型数据库的来龙去脉,了解其中的数学原理或逻辑基础所在,对提升数据库编程水平有质的影响
建议也是买一本数据库的相关书籍或者下载PDF电子书,能够把熟练的把第一范式、第二范式等数据库课程的基本知识点与数据库编程场景建立起关联,也基本达到了学习效果
4)编译原理 编译原理是编程语言以及各类语言编译器的科学基础,可以说编译原理创造了世界上的几乎所有的IT应用,学习编译原理的基础是数据结构和算法,因此编译原理的学习要花费更多的时间和精力,由于现代高级编程语言的编译器,在代码优化、资源优化方面已经做的足够智能,因此,编译原理的学习对实战的影响越来越小,但是正所谓本盛末荣,如果认为自己对数据结构和算法的学习达到了一个较高的水平和状态,可以在编译原理学习上进一步深入,最终把自己和普通程序员拉开更大的差距
2、英语能力 英语的天然特性和字母长度还有学科发展的历史因素,决定了编程语言一定是基于英语的,在编程过程中,从语言的关键词到文档的内容又或是搜索引擎的搜索结果,都不可避免的会遇到英文
大部分编程人员,都具备英语四级左右的英文基础,却由于非专业以及工作环境原因,逐渐疏远甚至完全淡忘了英语
而实际操作中,大部分编程语言资料都是英文,在线编程问答内容也是英文,因此,很有必要把英语能力重新恢复到一个不用太高但行之有效的水平,达到如下效果: 1)对自己所使用语言,每一个关键词都知道具体的英文翻译、逻辑含义以及读音
2)对于自己使用语言所涉及到的相关方法、类库、框架、工具等,能知道其中每一个方法、过程以及参数关键词等的英文翻译、逻辑含义以及读音
3)对常见的编程逻辑和核心关键词,能够用英文组织问题的描述,最简答的也行,只要能被搜索引擎读懂就可以
比如如何在C#中把整形转换为字符串类型这个问题,最简易的英文描述就是 C# Integer Covert To String
4)在自己技术知识范围内的任何的英文的技术手册、文档、文章或是问题描述,能够读懂8成的内容含义,能够读懂完整的技术含义
3、搜索方法 任何一个开发人员,都应当具备搜索能力,甚至是一定要具备搜索能力,搜索引擎的宝藏,是无穷无尽的,同样具备搜索意识的不同程序员,却因为搜索技巧的差异最终在程序开发质量、项目实施效率、甚至是工程产品质量上出现数倍的差异,因此,掌握高效、先进、灵活的搜索方法和技巧,是非常非常非常(重要的事情说三遍)有用的
其中主要的方法介绍如下: 1)搜索源选择 虽然英文的编程资料更为准确高效,但中文的编程资料数量上却占优,因此遇到问题第一搜索选择还是百度 谷歌对于专业中文词汇的处理能力有时候甚至比百度还要强,而且谷歌能搜出大量的英文资源,因此谷歌也是首选之一,但是由于谷歌被封锁,因此需要进行VPN、SSH等FQ操作,或者在百度搜索“谷歌镜像”关键词,通过谷歌的镜像网站进行访问
除了搜索引擎,专业的技术网站、论坛、社区也是非常直接有效的搜索源,比如国外的StackOverFlow网站,国内的Cnblogs博客园、OSChina开源中国等,都具备搜索功能,将问题关键词输入其中,也许也会很快的得到相关答案
2)关键词构造 搜索关键词的构造,直接影响搜索效率和正确结果的过滤,没有什么特别的技巧,关键在于搜索积累,但是总体遵循的原则是,准确和简洁,比如当出现一个描述,如何用C#对XML进行序列化和反序列化,非常愚蠢的关键词构造就是“如何用C#对XML进行序列化和反序列化”,而正确高效的关键词则是“C# XML 序列化 反序列化”,或者在谷歌里面搜索则是“C# XML Serialization”
在平时的编程中,一定要注意相关方法和经验的积累 3)联想搜索 联想搜索,不属于搜索引擎的范畴,却是在搜索中很有用的高级技巧,举一个通俗的例子,比如想使用C#,利用某个.NET类处理一种HTTP通讯,但是一直搜索不到完美的结果,不过换个思路,考虑到VB.NET也是.NET体系,和C#完全相通,那么也可以试着用VB.NET关键词进行搜索,搜索到完美代码后再临摹成C#代码
这样的联想搜索,不仅能够帮助搜索正确结果,也是对大脑思维的训练,值得多多尝试
4)资源搜索 开源的框架、产品、工具、控件等开发辅助类东西越来越多,稳健性和迭代性越来越强,去寻找一款成熟的工具或者插件,也成为了大量开发者的必备方法和技能,而如何高效的搜索出想要的资源,也成为了一门学问,其核心方法就在于知晓资源网站的地址,常见的例如有开源中国、Github、CSDN下载、pudn等
资源类网站需要平时多积累,到用到的时候会非常关键
4、思维模式 开发人员,一定要养成业务思维的模式,所谓的业务思维,就是在做任何一个项目的时候,写任何代码前,需要对项目本身的业务概念和业务逻辑甚至业务流程都要有一个全面的学习和理解,这虽然不是一个项目的强制要求,却是一个很好的开发习惯,无论自己的觉得是开发者还是测试员又或是技术总监,掌握了业务原理,才能够更好的设计或阅读项目的数据结构和流程结构
程序员的思维往往和用户或者客户是不一致的,摆脱技术思维模式,习惯于用业务思维解决问题的程序员,不一定最优秀,但一定是一个很容易沟通的程序员 5、工作与编程习惯 有的人说爱干净浪费时间,所以不修边幅,但归根结底这还是习惯问题,当养成清洁卫生的习惯并使之成为生活惯性时,往往就不会耗费更多的时间,反而显得干净干练
写程序同样如是,有一些编程习惯,看似不足为道,看似浪费时间,可是如果坚持下去,最终都能收到意想不到的奇效
下面列举一些特别重要的习惯
1)快捷键的使用 无论是使用Windows、Linux操作系统,还是在IDE中,快捷键都是系统本身的标配,事实上,Ctrl+C、V这样的操作,大部分人都能尝到在节省时间上的甜头,把这个概念进一步扩散,如果在IDE中编写代码,除了代码本身,将其余所有的鼠标操作、键盘定位操作,都用快捷键来代替的话,在时间上将会有数量级的节省,然而看上去这么好的事情,真正坚持去执行并形成习惯的人屈指可数,因此,在初期的改变习惯,记住快捷键,会是一个长期的过程,需要不断的坚持
2)代码注释 一个开发人员随着年龄和经验的增长,所参与的项目,再也不是靠一个人或者几个人就能完成的
系统的重构、代码的重构、工作的交接、对新进人员的培训等等类似的事情,会越来越多的遇到,这些事情无一例外都会把已经写过的代码重新或者重复阅读,如果在初始编写代码时,就做到完整、清晰明了的代码注释,对后续工作会有巨大的帮助
不仅提高工作效率,还能增强合作好感
事实上,就算只是自己看自己的代码,如果有注释,也能加深印象,缩短代码查找时间
因此,任何开发人员,都应该养成良好的代码注释习惯
优秀的代码注释应该能做到: 每一个函数、每一个属性甚至是变量的划分,都可以找到对应的解释
多使用越来越被IDE支持的XML注释方式,不仅有注释文字,更有详细的参数描述
对程序结构、模块、组成部分划分等也加以注释 3)命名规则 具备一定规模的软件公司,在代码编写上都有一套自己的命名规则,涵盖项目、模块、函数、变量等等,标准化命名的好处不言而喻,然而被动、被迫去遵守命名规则和主动习惯于使用命名规则是完全不一样的
一个优秀的开发人员,应当发自内心的希望各种代码命名都是有规则的,易读的,而不是纠结于命名规则会增加码字长度
4)不将就的编程逻辑 所谓不将就的编程逻辑,其对立面就是不讲究的编程逻辑,不讲究的编程,不仅是一种很坏的编程习惯,也体现了低下的生活品质,很多开发人员,因为个人习惯、赶工期、客户要求不高等多种原因,在编程时特别随意,体现在比如为了实现某个功能,百度出一段代码,直接套用,10行的代码只理解8行,有两行看不懂也放到程序里去使用,很多这样的小细节,就好比在项目中埋下了无数的定时炸弹,不仅有很大概率形成返工,更是为项目埋下了风险
编程人员,应当有担当有态度,养成不将就的编程逻辑,不勉强自己,也不轻视程序
5)数据备份 误删、误操作、电脑断电、文件遗失等等状况是每一个开发按人员都可能遇到的问题,如果不希望辛勤的劳作被浪费,不希望偶然的意外影响工作,那做好备份是必不可少的,在较大规模的公司,会有完整的源代码管理以及信息安全防护,而无论是在大公司工作,还是身处较小公司或者在实现个人代码价值时,都要做好代码和文档的数据备份,备份方式的选择灵活多样,有使用在线的CVS、SVN、TFS、Git源代码管理,也可以手工拷贝文件至云空间或者本地硬盘,甚至可以在个人电脑上组成RAID磁盘阵列等等,养成周期性、规律性的备份习惯
6)邮件工作方式 沟通是进步的源泉,如果说开发小组的热烈讨论是性格和激情的体现,那邮件的工作方式也是另一种稳重和高效
无论是公司层面的工作沟通,还是开发小组的问题交流,邮件的作用包括问题正规化描述、工作留档留痕、工作流程流转、责任分工明确等等,习惯于将重大问题、重要事项通过邮件的方式与同事、主管等进行沟通,将会非常有助于团队协作
以上这些方法,是我这么多年来的感受和体会,也给了我很大的帮助,希望也能够帮助到大家,不能说一定可以“提升修养“,但也是”提升修养”的有效方式
最后还想再说一说坚持的力量 分享一个真实的小故事,公司有两个开发人员,1个做.NET好多年了,但是很油滑,做事能省就省,抓到可以偷懒的机会就偷懒,让他学点新知识新方法总是自以为是觉得自己都会;还有1个毫无.NET基础,一直做低级语言开发,从15年才开始学习.NET和Web前端,但是做事很积极,几乎每天都自己抽空学习,遇到不懂的都琢磨清楚,遇到不会的场景就上网或者找人寻求帮助,项目结束后还反复思考有什么地方可以改进
从15年到现在,短短1年,这两个人的发展已经是天壤之别,工资差距也越来越大,后者已经能够独自操盘中小型软件外包项目,而前者还在混着日子,以后他们各自的发展也完全可以预见
每个开发者都应该有一把自己的瑞士军刀,在将来漫长的职业生涯中,这些工具可以为你省下宝贵的时间,并帮助你更好的组织个人知识库
举两个例子 ●一套高效的开发环境 ●一个信息采集器和一本笔记本 高效的开发环境 我们可以从编缉器谈起,这里有IDE vs Text Editor,有Vim vs Emacs,有Sublime vs Atom,那该如何选择呢?在做选择之前,我们先想想自己的目标
我们希望这是一个长期的投资,这款编缉器能被长期使用,在这个过程不断的打磨,使其能完全适合自己的习惯,最大化编缉效率
如果程序员是侠客,编缉器则是他手中的剑
虽然我是Vim的重度用户,但我觉得当年选择Vim时有欠考虑
如果让我重选一次,我的第一选择会是Emacs,第二选择会是Atom
Emacs已存在30年,社区仍然活跃,其可扩展性在编缉器中无人能出其右
Emacs的脚本语言elisp又是lisp的一种dialect,我觉得对lisp的学习可以提升程序员对编程核心思想的理解
另一个加分点是Emacs由于其本身的高门槛及lisp特质,吸引了大批高质素的程序员,其社区可谓藏龙卧虎,更诞生了像Org-mode这样神级的插件
反观Vim,Vim的精髓在于Mode editing,这是值得学习的,可以极大提高文本编缉的效率
但当你熟悉了这一理念后,我觉得可以转投其他编缉器,因为Vim的架构与Vimscript限制了其扩展性
Emacs通过Evil插件非常完整的支持了Mode editing,其他主流的编辑器也有类似插件,所以你一旦掌握了这个理念,在别的编辑器中也可以发挥作用
可能有人会说没有一个Vim emulator能做到Vim 100%的功能,但重点不在于某条指令是否被移植,而是mode editing思想的精髓能否被移植,我觉得答案是肯定的
再看Atom vs Sublime,Atom的可扩展性非常好,它的大部分核心功能也是以插件的方式实现,这点与Emacs有异曲同工之妙
并且其开源的特性,使我相信它有比Sublime更持久的生命力
关于IDE,我的看法是,我不排斥IDE,但每个IDE都是为了某个特定的任务或是编程语言服务的
做为一个有追求的程序员,可以用IDE,但依然需要精通一个强大的通用编缉器
类似编缉器,高效的开发环境还包括Shell,Launcher,窗口管理器,文档阅读器等等
其中有一部分只需要你化很少的时间就可以完成配置,它们的投资回报率是非常高
信息采集器和笔记本 前者是用来收集别人产生的信息,后者则是收集自己产生的信息
前者一个简单的例子就是浏览器的Bookmark
你需要能随时将一组有用的信息归档,并在未来的某个时刻快速找到它
后者最直观的例子则是Mac OS或是iOS自带的笔记本,这里的目的是能随时随地记录你自己的想法
从本质上讲,就是你需要有一套好用的工具来做你的知识库管理(Knowledge management),也可以说是你知识和思想的外部备份
我个人现在是用Evernote同时来做信息采集与笔记的
如果有一个好的流程,你也完全可以用两个工具来分别把这两件事做好
但我建议你花足够多的时间来思考如何组织你的个人知识库
以上只是两个典型的例子,你需要做的是发现那些你要长期从事的任务(往往不随技术而改变,也不随公司而改变),将完成这些任务所需的工具调整至最优
再举一个例子,我会留意身边的程序员所用的键盘只有少部分的程序员会买高端的静电容键盘,比如HHKB
而在我看来,这明显是一笔很划得来的投资,程序员在工作的大部分时间里都需要和键盘打交道,一个舒适的打字体验是非常有收益的,更何况这类高品质的键盘都非常的耐用
开阔你的视野,构建你的技术体系 首先你要给自己设定一个目标,就如同一个公司会设定它的Vision
●目标要够大,这样你才能看到更多的风景 ●目标应该设定在解决哪一类问题,而不是精通哪一类技术技术只是手段,不是目的
例如,“我要成为iOS developer中的达人”这个目标,就远不如“我要成为前端应用开发的专家”来得有意义
前者学到深处你可能会去钻研iOS framework里各种奇技淫巧,而后者你会开始关注视觉与交互设计,研究各平台间的差异与共同趋势
显然,后者更有助于你的个人发展
不过即便有了明确的目标,选择哪一类技术学习,如何学习,在信息过载的今天依然是一个难题
常有的观点是应该学习最新的技术,因为老的已经过时,而反对的观点则是新技术还不成熟
我个人的观点是,当初入一个领域时,选择主流技术框架;当你有一定经验后,选择技术时更应该关注背后的推动者,我相信优秀的人和团队总能打造优秀的产品,无论是商业公司还是开源社区
不必太在意技术的新旧,因为可能很快都会成为过去时你真正要学习的是技术背后的思想
有不少语言与开源项目会写它的Coding philosophy,这是很意思的,你可以从它们的源代码中去验证这些编程理念
以Python为例,如果你执行import this就会看到它的理念,再如Python中一个著名的开源库Celery,在它的文档有专门一节讲述它的编程理念
它们对你的影响会比这些技术本身来得更深远,这是我给初学者们的一个忠告
同理,我非常推荐读一些优秀开源库或是语言的源代码,例如Python的标准库绝大部分都是用Python实现的,而且可读性非常好
如果学习一门技术仅仅停留在用的层面上,你就还没有完全吸取其中的精华,而且学习的收益会随着技术的过时而消失
我的另一个学习原则是,在选择学习一门新技术时,最大化它与你现有知识库的差异性
读起来可能有拗口,例如你会Django,接下去你应该去学习Ruby on Rails还是NodeJS? 依据这个原则,你应该学NodeJS,因为它的异步IO模型在理念上与Django的同步模型差异很大,而RoR则与Django更多相似之处
但更好的选择是不要去学另一个Web framework,去学习ZeroMQ或是Redis,这两者对于Web development也非常有帮助,这样就做到了最大化差异
从构建一个程序员的技术理念角度,我会推荐每一个程序至少去了解Lisp或是一门Functional programming language,不管你是否会在可见的未来用到,它们能让你从一个不同的角度看待编程
最后我建议每个程序员都应该经营一款自己的产品,它可以是一款app,一个网站或是一个开源软件
除非你是一个创业公司的早期员工,不然你可能没有机会将所有学到的技术或是理念都付之实践,有很多人想成为全栈工程师,最快的捷径就是打造一款自己的产品
任何一个设计师都会精心打造自己的Portfolio,但大部分程序员却不会
当评估一个程序员的Coding能力时,我会去看他的Github上是否有出彩的项目,可惜国内绝大部分程序员的Github空空如也,或者只有一些非常简单的程序
我建议大家好好经营自己Github上项目,这不但可以提高你的声誉,对你将来的求职也非常有帮助
当你报怨求职面试时又被问到各种无厘头的程序题时,有没有想过面试官也很无奈,因为他没有任何其他方法得知你的Coding能力究竟如何
如果每一个程序员都有自己的作品,我想程序员的面试会简单许多
本文编号1844,以后想阅读这篇文章直接输入 1844 即可
●本文分类“ 修炼之道 ” , 搜索分类名可以获得相关文章