精华内容
下载资源
问答
  • 今儿的题目,有些标题党色彩,各位莫怪,算是有感而。回顾一下我的代码生涯,毕业之前,主要用的Visual Basic,毕设是自学Java的,刚开始工作时,Proc的Tuxedo应用,J...

    今儿的题目,有些标题党色彩,各位莫怪,算是有感而写。

    回顾一下我的代码生涯,毕业之前,主要用的Visual Basic,毕设是自学Java写的,刚开始工作时,Proc写的Tuxedo应用,Java写过应用程序,Python写过一些小功能,还使用Android开发过小工具(业余,纯的),Shell当然也用过,有些杂,但确实算不上精通这种的。

    初入职场的时候,给了个任务,通常上来就写,写着写着,发现不太对,回来再对需求,改了继续写,反反复复,浪费精力的同时,很可能做的未必是需要的,事倍功半。

    最近因为工作需要开始写代码了,我可不算是专业码农,相比很多人,我的经验很欠缺,所以这个过程,对我来说,还是很具挑战的,或者可以说“无知者无畏”。但是这些年接触了一些系统设计、排查问题跟踪过代码、学习过前辈的经典示例,俗话说“没吃过什么,还没见过什么跑?”,虽然是句玩笑,但是蕴含着一定的道理,很多牛人做事的过程,还是值得我来借鉴学习的。

    如果我们想事半功倍,应该怎么做?

    这个话题很广,可能每个人都有自己的见解,我就闲聊下自己的一些不成熟的见解,欢迎各位牛人,评论补充,给我们些指引。

    无论是写代码,还是其他工作,最重要的一点,就是先得想清楚,包括你的目标、范围、逻辑、流程。

    首先,你这项工作的目标是什么,如果太多,可以划成小目标、阶段性的目标,最重要的是结合自己的能力可落地的目标,如果设定的目标,靠自己根本不可能完成,这个事情,或者当前做事的路径,就是无意义的,需要调整。

    其次,明确阶段性需求,罗马不是一日建成的,无论是工具,还是系统,至少对我这个凡人来说,不太可能做到一步到位。这就得根据阶段性目标,梳理阶段性需求,为了达到目标,我们的需求是如何设定的,范围是什么,合理不合理?

    第三,就是设计,无论是底层代码,还是数据字典,无论是数据维护,还是问题排查,这个阶段其实是很重要的,日志写什么?数据表怎么定义?数据一致性怎么保证?运行异常怎么看?加个规则怎么做?流程图是什么?事务控制是什么?这些都是隐藏在设计之中的。正所谓“磨刀不误砍柴工”,因为这些工作,是真正做代码开发的基础,当然,作为凡人,我认为设计一步到位,也是很困难的,但至少需要保证方向正确,细节的调整,还是可以接受的。设计除了满足当前的需求外,应该尽可能考虑一些未来可能的扩展,未必想得太多,至少不让扩展的代价太高。

    做了这三个步骤,才是开始写代码,写的过程中,肯定会碰到各种的问题,这是很正常的,心理预期和心理建设要做好,这个其实很重要,记得开始工作时,碰到一些技术问题不知道怎么解,可以说吃不香睡不甜,消耗自己,还可能影响他人,其实有时候,换换脑子,劳逸结合,可能就会碰到灵光一现,就像前天,碰到个技术问题,没想明白,早上梦中惊醒,给了我个思路,你说这是巧不巧?

    P.S. 有朋友说多睡会,可能能解决更多的问题,这个不就是传说中的毛利小五郎?可以尝试下:)

    以上从需求到开发的过程,说起来很容易,好像我们日常工作都是这些阶段,但是能将每个阶段做好做扎实,确实不容易,经验积累更是不能少,可能很多都得让我们自己体会,才会形成我们自己的知识体系。

    不光是写代码,对其他事来说,想清楚了再做,总会比没想清楚就开始做,目标性更强,我们慢慢体会了。

    近期更新的文章:

    支持超过4000字节的varchar2类型

    “自以为对的”MyBatis空闲连接探测的机制

    创建主键的三种方式对指定索引表空间操作的纠正

    Oracle优化器的“短路”

    MySQL行转列的小需求

    Oracle的greatest和least函数

    我的股市生涯

    Oracle创建主键的三种方式

    非Oracle Linux下Oracle 19c CDB数据库安装

    案例纠正一则

    Redis和Sentinel的安装部署和配置

    “火线”和“零线”

    通过索引提升SQL性能案例一则

    如何手动添加jar包到maven本地库?

    1元股权转让的一点思考

    如何打造一个经常宕机的业务系统?

    Linux恢复误删文件的操作

    Linux的scp指令使用场景

    Oracle处理IN的几种方式

    如何搭建一支拖垮公司的技术团队?

    IP地址解析的规则

    MySQL的skip-grant-tables

    国产数据库不平凡的一年

    Oracle要求顺序的top数据检索问题

    日常工作中碰到的几个技术问题

    了解一下sqlhc

    Oracle的MD5函数介绍

    Oracle 19c的examples静默安装

    sqlplus登录缓慢的解决

    VMWare 11安装RedHat Linux 7过程中碰到的坑

    COST值相同?是真是假?

    Oracle 11g的examples静默安装

    文章分类和索引:

    公众号700篇文章分类和索引

    展开全文
  • Go 语言作为开源项目,我们可以很轻松地获取它的源代码,作为一门编程语言,它有着非常复杂的项目结构和庞大的代码库,今天的 Go 语言项目中差不多有 150 万行源代码,其中包含将近 140 万行的 Go 语言,我们可以...

    ede809a94ceec2760542e5113e40097d.png

    Go 语言作为开源项目,我们可以很轻松地获取它的源代码,作为一门编程语言,它有着非常复杂的项目结构和庞大的代码库,今天的 Go 语言项目中差不多有 150 万行源代码,其中包含将近 140 万行的 Go 语言,我们可以使用如下所示的命令查看 Go 语言的代码行数:

    $ cloc src
        5988 text files.
        5875 unique files.
        1165 files ignored.
    
    github.com/AlDanial/cloc v 1.78  T=6.96 s (693.7 files/s, 274805.2 lines/s)
    -----------------------------------------------------------------------------------
    Language                         files          blank        comment           code
    -----------------------------------------------------------------------------------
    Go                                4199         139910         221375        1398357
    Assembly                           486          12784          19137         106699
    C                                   64            718            562           4587
    JSON                                12              0              0           1712
    ...
    -----------------------------------------------------------------------------------
    SUM:                              4828         154344         242395        1515787
    -----------------------------------------------------------------------------------

    随着 Go 语言项目的不断演进,整个代码库也会随着时间出现变化,所以上面的统计结果每天都有所不同。虽然 Go 语言项目有着巨大的代码库,但是想要调试 Go 语言并不是不可能的,只要我们掌握合适的方法并且对 Go 语言的标准库有一些了解,就可以调试 Go 语言。

    1.编译源码

    假设我们想要修改 Go 语言中最常用的方法 fmt.Println 的实现,例如:在真正打印字符串之前先打印任意其它的字符串,我们可以将该方法的实现修改成如下所示的代码片段,其中 println 是 Go 语言运行时提供的内置方法,它不需要依赖任何的包就可以向标准输出打印字符串:

    func Println(a ...interface{}) (n int, err error) {
    	println("draven")
    	return Fprintln(os.Stdout, a...)
    }

    当我们修改了 Go 语言的源代码项目,可以使用仓库中提供的脚本来编译生成 Go 语言的二进制以及相关的工具链:

    $ ./src/make.bash
    Building Go cmd/dist using /usr/local/Cellar/go/1.14.2_1/libexec. (go1.14.2 darwin/amd64)
    Building Go toolchain1 using /usr/local/Cellar/go/1.14.2_1/libexec.
    Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
    Building Go toolchain2 using go_bootstrap and Go toolchain1.
    Building Go toolchain3 using go_bootstrap and Go toolchain2.
    Building packages and commands for darwin/amd64.
    ---
    Installed Go for darwin/amd64 in /Users/draveness/go/src/github.com/golang/go
    Installed commands in /Users/draveness/go/src/github.com/golang/go/bin

    ./src/make.bash 脚本会编译 Go 语言的二进制、工具链以及标准库和命令并将源代码和编译好的二进制文件移动到对应的位置上。如上述代码所示,编译好的二进制会存储在 /Users/draveness/go/src/github.com/golang/go/bin 目录中,我们需要使用绝对路径来访问并使用它:

    $ cat main.go
    package main
    
    import "fmt"
    
    func main() {
    	fmt.Println("Hello World")
    }
    $ /Users/draveness/go/src/github.com/golang/go/bin/go run main.go
    draven
    Hello World

    我们会发现上述命令成功地调用了我们修改后的 fmt.Println 函数,而在这时如果直接使用 go run main.go,很可能会使用包管理器安装的 go 二进制,得不到期望的结果。

    2. 中间代码

    Go 语言的应用程序在运行之前需要先编译成二进制,在编译的过程中会经过中间代码生成阶段,Go 语言编译器的中间代码具有静态单赋值(Static Single Assignment、SSA)的特性,我们会在后面介绍该中间代码的该特性,在这里我们只需要知道这是一种中间代码的表示方式。

    很多 Go 语言的开发者可能都知道,我们可以使用如下所示的命令将 Go 语言的源代码编译成汇编语言,然后通过汇编语言分析程序具体的执行过程:

    $ go build -gcflags -S main.go
    	rel 22+4 t=8 os.(*file).close+0
    "".main STEXT size=137 args=0x0 locals=0x58
    	0x0000 00000 (main.go:5)	TEXT	"".main(SB), ABIInternal, $88-0
    	0x0000 00000 (main.go:5)	MOVQ	(TLS), CX
    	0x0009 00009 (main.go:5)	CMPQ	SP, 16(CX)
    	...
    	rel 5+4 t=17 TLS+0
    	rel 40+4 t=16 type.string+0
    	rel 52+4 t=16 ""..stmp_0+0
    	rel 64+4 t=16 os.Stdout+0
    	rel 71+4 t=16 go.itab.*os.File,io.Writer+0
    	rel 113+4 t=8 fmt.Fprintln+0
    	rel 128+4 t=8 runtime.morestack_noctxt+0

    然而上述的汇编代码只是 Go 语言编译的结果,作为使用 Go 语言的开发者,我们已经能够通过上述结果分析程序的性能瓶颈,但是如果想要了解 Go 语言更详细的编译过程,我们可以通过下面的命令获取汇编指令的优化过程:

    $ GOSSAFUNC=main go build main.go
    # runtime
    dumped SSA to /usr/local/Cellar/go/1.14.2_1/libexec/src/runtime/ssa.html
    # command-line-arguments
    dumped SSA to ./ssa.html

    上述命令会在当前文件夹下生成一个 ssa.html 文件,我们打开这个文件后就能看到汇编代码优化的每一个步骤:

    493b254899aa15b3094cdc6306947dcd.png
    图 1 - 1 SSA 示例

    上述 HTML 文件是可以交互的,当我们点击任意的汇编指令,它都会使用相同的颜色在 SSA 中间代码生成的不同阶段标识出相关的代码行,更方便开发者分析编译的过程。

    3. 小结

    掌握调试和自定义 Go 语言二进制的方法可以帮助我们快速验证对 Go 语言内部实现的猜想,通过最简单粗暴的 println 函数就可以调试 Go 语言的源码和标准库;而如果想要研究源代码的详细编译成过程,我们可以使用上面提到的 SSA 中间代码深入研究 Go 语言的中间代码以及编译优化的方式,不过只要我们想了解 Go 语言的实现原理,阅读源代码是绕不开的过程。

    全套教程点击下方链接直达:

    IT实战:Go语言设计与实现自学教程zhuanlan.zhihu.com
    de410f87352359caa7f292b66b3a698d.png
    展开全文
  • 写代码那些年--开始--自学之路寻路准备。自学开始。杂乱乱学。离散数学。C语言。C++工作后尾声: 寻路准备。 决定转行IT后,接下来的事儿,就是学编程了,那时候,对计算机的使用,仅限于日常办公一类的。对于编程...

    寻路准备。

    决定转行IT后,接下来的事儿,就是学编程了,那时候,对计算机的使用,仅限于日常办公一类的。对于编程写代码,可以说是很迷茫,怎么搞?从哪里开始?如何下手?一头雾水。左思右想后,当时我想到了一种取巧的方式学习,我想:我不懂这个,就没必要瞎折腾,网上查也可能事倍功半,走没必要的弯路只是浪费时间,于是我就找了几个关系好的计算机学院的同学,让他们帮我出主意,该怎么学,推荐我一些书,我自己对着练。当时我让他们告诉我怎么学还不算完,还让他们帮我推荐一些书单,列出书的名字,出版社,作者。这样我比较容易买,而且,让他们帮我找了很多他们的教材给我。经过好几位计科院的同学的推荐参考,结合我自己查的资料,以及我自己的学习习惯(我对学习的态度是,万变不离其宗,学习东西得把基础学牢靠,这样才能厚积薄发),得出的结论是这样的:先学数学知识(高等数学,线性代数,概率论和数理统计,离散数学),其中前三门数学大一大二都学过,离散数学他们强调了很重要,他们告诉我说,他们老师说:程序=数据结构+算法。他们说,编程牛的人都是数学家。

    自学开始。

    杂乱乱学。

    经过他们的指导,我学习的流程是这样的:那一年我从九月开始一直到十月底,把操作系统,计算机网络,数据库,编译原理,还有他们给我的一大堆教材,硬着头皮看了一遍,很晕,感觉啥也看不懂。

    离散数学。

    十一月开始学离散数学,学到第二年一月底,课后题也会做完,这个没啥说的,跟大学学数学一样。
    汇编语言(ASM)
    二月四号开始学汇编语言(ASM),学到四月二十四,学习用的那本汇编书是自己网上进行大量查询工作后买的,然后看一点写一点代码,现在还记得当时一整个周六的上午,就在做一个书里面的课后题,二进制十六进制十进制之间的转换。因为没人教,当时为了运行书中的汇编代码,查资料下软件搞到想吐,好在坚持下来了,最终把写汇编代码的模拟开发环境配置好了,接下来就是按部就班的学习了,硬着头皮啃,看懂一节就把当节的汇编代码在电脑上一个字母一个字母的码进去,运行,调试,最终做到每一个程序运行结果跟书中一致,可能你看到这里觉得平平淡淡,但是你实际做了,才知道里面有多大的工作量。运行完每一节的汇编代码后,再把书中当节的课后题做了,如果课后题是编程题,就自己先在纸上写代码,然后敲到机器里面运行,这点很痛苦,有的课后题怎么做都运行不出来。这两个多月,按着:看懂一节——手动码这节中的代码并运行正确——做课后题,这样的流程,学到三月底,把汇编语言这本书第一遍学完了,当时心里窃喜,感觉很不可思议,本来想接着进行下面的学习,但是觉得不踏实,觉得很多还不理解,然后硬着头皮进行第二遍学习,跟第一遍一模一样的方式,码书中的代码也是一个个字母重新敲重新运行,绝不拷贝,做课后题也是,第一遍怎么也做不对的一些题,第二遍莫名其妙的却做对了,第二遍进行的很快,四月中旬就学完了,学完后,觉得不过瘾,书中还有很多不理解的,于是,学了第三遍,你可能觉得我有病,但是确实学了第三遍,跟学第一遍一样,奇怪的是,码代码更快了,码完后运行代码正确率高了,第三遍只只用了一个多星期就写完了,第三遍学完后,书里面除了少部分课后习题,基本上都理解了。到第三遍结束,你猜最大的感觉是啥?你可能想不到。我当时由衷的感谢这本书的作者,打心底尊敬他感谢他,到今天想起来依旧是这样,当初第三遍学完了感觉不久后还会再回头看看学学,而直到今天,也没再学汇编,不过那时候打下的汇编基础,到现在还受用不尽。比如对内存的理解,对字节位的理解,对调用的理解,特别是对反汇编和debug技能特别有帮助,debug能力,是一个程序员的重要标志,在那之后的技术学习,我基本是按着汇编语言的学习套路:踏踏实实打基础,硬着头皮啃,啃下来了就会发现整个过程就是提高的过程。现在大部分的IT人,都不怎么玩汇编了。如果你想自己学汇编程序(ASM),我觉得你必要跟我当初一样,自己瞎查资料,然后总结分析哪个资料靠谱哪个书好,编码开发环境怎么搭建需要哪些软件,汇编语言跟其他语言不一样,编译器软件也不大一样,没必要在这里独自探索,对汇编感兴趣又想学的,联系我就行了(我的v是:IT996007),我把相关软件和电子书发给你就可以了,当然,建议买回那本书,我个人最喜欢拿着纸质书学技术。学汇编那两个多月多,都是晚上的零碎时间,比如有时候学半小时,有时候学一两个小时,还有周末,周末两天时间能学很多,时间也连贯,效果最好,平时晚上零碎时间学之前还得快速看前一两天的内容熟悉下。

    C语言。

    汇编语言(ASM)学完后,接下来学的是C语言,当时他们给我推荐的是他们的大学教材,你可能猜到了,清华大学谭浩强的——C程序设计,当时查了强哥的名头,心里觉得强哥是个很牛的人,但是后来才发现,盛名之下。。。,举个例子,后来跳槽,经常会碰到一些做面试题中面试题出错的情况,一看那错误点,就知道是强哥的弟子,有一次我实在受不了了,我点着其中一个错误的地方,就跟面试官说,你们大学用的是不是谭浩强的教材,他们回答,不过表情已经说明了。如果你打算学C语言,千万别用这本书,现在回想起来我真庆幸当时没用这本书,当时我拿着这本书看了一节,总觉得这本书哪里不对,往后整体翻翻,更觉得不喜欢,然后我就买了我自己网上查的那本书,买回来后,我严格按着学习汇编语言(ASM)的方法,从四月底一直学到六月中上旬,第一遍用的时间比较长,学到五月底才学玩,看懂一节就手动敲一节的代码运行正确,课后题尽量做,第二遍快一些,六月初就学完了,学习方法跟第一遍一样,到了学习第三遍就更快了,只用了一个周,三遍的学习方法都一样,学习C语言的过程中,才深刻体会到,前一阶段学汇编的时候打下的基础有多重要,把C语言学完后,我当时就想出去找工作,现在想想那时候真的太轻狂了,如果当时出去找工作,很可能找不到,但是也不好说。ps:如果你正在或者正想学C语言,还在找教材阶段,你联系我吧,咱一起沟通,我给你分享我的资料,联系我就行了(我的v是:IT996007)。

    C++

    六月上旬我把C语言学完后,紧接着就是学C++了,当时正好赶上端午节,我趁着端午节假期,加上之后的几天连同周末,整整七天时间,每天吃完早饭后,学几个小时,到了中午吃饭午休,下午再学几个小时,晚上吃饭,然后再学到晚上九点多或者十点多,然后睡觉,就这样持续了整整一周,把C++主体学完了,那本书有不到二十章,七百页左右,每天平均学了三章,你可能觉得我吹牛,也可能觉得不可能,不过这是真的,当时一起住的还有三个人,他们眼看着我这么干的,等我学完了他们也惊呆了,更让他们惊呆的是,我学完后立马投简历出去找C++的工作了,而且还找到了,当时的薪资还凑合。当时是八月份入职的。现在回头看,当时就是时间连贯,不分昼夜的学,精力高度集中,所以才那么快,不过学的效果现在看应该是很浅,STL部分,只是知道那样,内部机制和特性完全不知道,入职使用STL的时候,哪哪都不会,都得硬查硬写,反复调试,实战跟对着书学完全不一样,当时入职后,前大半个月很懵逼,等把第一个分配给我的任务做完后,才有点感觉,找到了一点感觉后,才惊魂未定的有点信心了,那会儿做完了第一个任务,才觉得转行算是转过来了,等后续博客我会单独写一个转行第一次的面试履历。

    工作后

    第一份工作虽然是越来越熟悉越来越顺利的做下去了,但是工作中啥都觉得是新的第一次接触,觉得同事们会的都可多,自己要学的也很多,第一份编程工作,下班了我也不敢懈怠,先是把C++学了第二遍第三遍(当时学了第一遍就去找工作了),然后根据之前查的资料,学了linux及其相关的东西,现在觉得当初开始学编程之前,我自己查资料那个痛苦的阶段,没有白费,从啥都不懂两眼抹黑开始一点点查,一点点看查到的资料琢磨整理,在自己脑子里捋出编程需要的知识框架,然后再根据知识框架一点点找框架中每一个部分的资料和经典书籍,现在看来当时的套路是对的,到后来一点点的完善自己的知识框架,等把知识框架完善后,已经是好些年了。如果你想或者正在自学,咱们不妨交流一下,可以给你分享我的资料,上面有我的v号。一句话,我觉得编程的三大基石:操作系统,网络,算法&数据结构。当然编程语言是前提(毫无疑问是C语言或者C++,C++有的叫CPP,如果你说汇编语言asm也不错), 把这三块基本搞熟了后,你会发现,学其他的东西,万变不离其宗,而且学起来很快很简单。随着工作的时间推移,工作中用到的技术越来越多,比如,学golang我用了四天,pyhthon我用了两天,linux shell现学现卖,几个小时,linux中的awk 和 sed也是几个小时。jave和C#也是直接改代码。其他的比如mongo,redis,k8s, docker等等这些眼花缭乱的web类的工具和技术,基本上是现学现卖,深入研究也不费事儿。前提是你的基础打下了。

    尾声:

    说这么多,总结一下,我的自学的路,走了一些弯路,所幸的是初始阶段学习汇编和C/C++这三部分,正确无比,为后续的学习网络,操作系统,算法打下了最基本的基础,可能你会问,学其他语言,我再学网络,操作系统,算法就不行吗?行,这里不抬杠,我就简单罗列一下你看看就知道了:unix/Linux系统是C语言和汇编语言写的,网络方面 BSD tcp/ip(有的人叫socket)用C语言实现的,计算机程序设计艺术里面的代码是汇编。。。,C语言写的东西,到现在四五十年了还在很健壮性能很好的跑着。我的v是:IT996007 ,欢迎指正和相互分享心得分享资料,说实话,手里的资料太多了。。。

    展开全文
  • 在前边大家好,我叫小鹿,目前正在上大三。今天呢,我想简单的分享一下半年来自学数据结构与算法学习方法和技巧。这篇文章主要目的还是重在让刚刚接触数据结构的读者按照总结步骤进行阶段性学习。小鹿上的一所...

    15c98016ad48801f62a33ad5e1a06cf6.png

    写在前边

    大家好,我叫小鹿,目前正在上大三。今天呢,我想简单的分享一下半年来自学数据结构与算法学习方法和技巧。写这篇文章主要目的还是重在让刚刚接触数据结构的读者按照总结步骤进行阶段性学习。

    小鹿上的一所普通的三本大学,大学的三年时间基本在自学编程,毕竟课上老师所授的课程很浅,老师讲述一个知识点是要考虑到大部分不同理解能力学生的,所以对于我这种喜欢刨根问底的学生从大一开始不得不花费大量的时间来自学编程。自学呢,我更注重效率,效率在哪里来?我相信很多自学编程的人最讲究的就是方法和技巧,而小鹿的学习方法是不断的几个阶段循环总结而出的,那就是动机、目标、实践、反馈、提高标准

    我的基础

    先说一下学习数据结构之前处于一个什么的基础,大二的时候就开设了数据结构的课程,但是当时对数据结构并没有什么兴趣,再加上学校环境的原因,期末考试背一下原题就过了。再一次接触到数据结构的时候(也就是一年后),几乎和零基础没什么本质上的区别,所以说才有了下边的对于零基础的学习数据结构的方法。

    我的学习动机

    学习一门技术首先要有动机。那什么是动机呢?我们经常看到减肥的人通常在房间里放一张好身材的图片,就是为了产生动机每天坚持减肥。学习也是一样的,没有动机就没有的学习下去的动力。那我学习数据结构的最初动机是什么呢?快实习了,想让自己找一家好的公司实习,没有数据结构与算法的基础不可能进入一家理想的公司的,所以我将进入一家理想的公司作为学习的动机。

    我的收获

    经过大三上半年对数据结构的自学,和以前那个自己相比有了质的飞跃,从最基础的某一数据结构的由来、是什么,特点以及优缺点到实际项目中应该如何运用,再到如何培养自己下意识的数据结构(遇到问题,根据问题的特性就能下意识的想到用哪个数据结构来解决)。到后来逐渐的学会了将多种数据结构联系起来进行解决问题,这样做的目的就是能够让程序性能更加稳定,效率更加高效。

    这些都是这半年来每天和数据结构打交道不断的训练出来的,这半年基本没有一天放松过,我相信功夫不负有心人,即使基础再不好,头脑再笨,通过我总结的操作步骤也能学好数据结构。

    我的实践

    因为我上的是一所三流大学,大多数时间考自学,总结了很多的提高学习效率的方法,那么在学习数据结构上我是怎么做的呢?我将数据结构的学习分为了三个阶段。

    第一阶段:认识数据结构

    第一步:学习它就应该知道数组、链表、栈、队列、散列表、跳表、图、树、堆、字典树10种数据结构用来干什么,为什么,怎么做,小鹿建议去看一些基础的数据结构书籍或者借助百度和谷歌简单了解一下每种数据结构用来干什么,为什么,怎么做就可以了,然后可以简单做一下笔记和博客。

    第二步:每种数据结构都有它的优缺点和性能的好坏,那我们以什么标准来衡量数据结构与算法的性能好快呢?那第二步就学习时间复杂度、空间复杂度相关的复杂度分析的内容,这部分内容至关重要,因为后边要学到的数据结构与算法都要有一个衡量性能标准的,为了能够不同的问题解决选择出性能最优的数据结构和算法。

    第二阶段:深入数据结构

    第一步:写代码。上边最基本的十种数据结构相关特性和使用条件都做笔记了,然后我们从头开始对每种数据结构进入深入研究,首先数据结构涉及到的操作,比如增、删、改、查等操作要自己实现一遍,在机器上运行一遍,写代码的时候一定要注意以下几点:边界条件、指针、代码的规范。

    这样会使你更加的对代码有颗敬畏之心,每次写代码都要认真对待,如果机器上写代码没问题了,可以自己通过在笔记本上用笔手写亲自实现一遍,有利于你加深你的代码逻辑的理解。

    第二步:在第一阶段中我们了解到性能的衡量标准,那下一步就再回过头来对10种最常用的几种数据结构涉及到的操作进行性能分析。你可能会问,为什么不边写代码边进行性能分析呢?我觉得分阶段的好处就是能集中解决问题,写代码就是要锻炼写代码的思维逻辑能力,性能分析就是要提高自己的分析能力,性能分析完成之后再看一下之前写的代码有哪些可以进行优化改进的。这期间你会遇到各种问题,遇到问题怎么做,我通常会去百度或者谷歌借助别人写的文章进行总结记录到笔记本上。

    第三步:每种数据结构的性能分析完成之后,再进行对每种数据进行深入。第一阶段我推荐的是看一些基础的书籍,涉及到的知识层次不深。但是我们还是要至少手中有一本具有权威性深入解析的数据结构书籍才能对一些概念进行深入的理解。基础书籍毕竟是让你入门的嘛,我们可以通过这些权威性高、内容全面的对已学到的数据结构知识点进行查缺补漏。

    第四步:单独的深入学习真的很枯燥杂么办,那么我们就实际生活中的例子去分析,比如猜数字游戏、0/1背包问题、走迷宫、八皇后问题以及满减凑单问题等。如猜数字游戏,我们可以想想怎么才能在最短的时间内猜到正确的数字呢,可能你会想到使用二分查找。那好了,我们问一下自己二分查找存在的问题,这个过程中一定要多问自己为什么,只有这样你的知识层次才会得到扩展,比如二分查找如果数据中有重复数据怎么解决?

    我还是要强调一下,一定要多问自己为什么,因为从心理学上来讲,人的大脑符合最小阻力原则,就是思考的事情最不喜欢做,所以这里我们要逆着来,才能进一步进行突破。如果你觉的上述两个阶段没有问题了,我们就进行下面的第三个阶段检索数据结构。

    第三阶段:检索数据结构

    第一步: 这时你可能学的非常多的关于数据结构的内容,但是很难运用,那怎么能够在实际实际问题中运用起来呢?我们前边已经将零碎的知识点整理到笔记本上了?接下来该怎么做呢?我们可以借助思维导图,对知识体系化整理,无论是复习巩固都利于我们进一步加强。

    第二步:上述整理成体系之后完毕之后,然后去谷歌或者百度搜索一下有明确解决方案的实际问题拿来进行分析学习,你到这些实际项目中会发现,很多问题涉及到多个数据结构问题,我们前边解决的还不过是针对单一的数据结构,那就尝试着自己将数据结构之间建立联系,比如数组和链表,每种数据结构都有优缺点,你在学习的过程中你会发现一个数据结构的优点正是另一数据结构的缺点,数组在内存空间是连续的,对CPU缓存友好,而链表在内存中是零碎内存空间,对CPU缓存不友好,但是链表可以动态扩容而数组不可以。

    再比如为了提高程序的效率不得不用消耗更多的内存空间的数据结构去代替另一数据结构,如果内存紧张,对执行效率要求不高的话,我们又用省内存执行效率稍有不高的数据结构去代替占内存大而执行快的数据结构。

    第三步:学会将实际问题转换成所学的数据结构。怎么转化呢?如:假如你是一名工程师,要对链表实现缓存的算法进行优化你会怎么解决?我们先将问题转换成学过的数据结构,里边提到链表,好那我们知道有链表了,在分析用链表实现了那些操作?淘汰数据、查找数据、缓存数据,这三个操作里边都涉及到查找,我们不得不遍历整个链表,时间复杂度为O(n)。

    那我们就想能不能对查找进行优化呢?根据问题或者数据的特征找适用的数据结构,缓存的三个操作涉及到快速的插入、删除、查询数据,我们在大脑中快速的检索可以快速的实现插入、删除、查询的数据结构有哪些?平衡二叉树、散列表、跳表等,比如我们选择散列表,最后分析一下时间复杂度是不是优化了很多,否则我们再换另一种数据结构进行性能分析。

    我们不难发现,实际问题就会一步一步的分解成了我们学习到的数据结构的基本操作分析,然后利用我们学到的数据结构的优缺点和性能分析得出最优解绝方法,但是在企业中遇到实际问题中往往比我们拿一些做练习的实际问题复杂的要多。

    我的反馈

    我们把每次解决问题或者每一遍去复习数据结构都要有所收获,同样的知识怎么增加自己的收获呢?那就是要不断的反馈给自己信息,比如,散列冲突当前的解决方法在实际项目中不适用,那我将这个信息反馈给自己,问一下自己有没有更好的解决办法?反馈之后,接下来就是提高学习的标准了。

    提高标准

    学习数据结构总会遇到瓶颈的,当我们走出瓶颈之后就会很顺利很多,那你会问接下来有没有再提高的可能了?会有的,接下来你就讲提高自身的标准,比如你解决生活中的实际问题让自己有下意识解决问题的能力,不借助任何参考数据,这方面对自身的要求很高的,再比如提高工作的效率,看起来非常高标准的,我相信每个人只有不断的通过努力的实践、反馈总有一天会锻炼出来这种能力的,相信你。

    文章中可能有很多不足,也希望你能提出宝贵的意见反馈给小鹿,小鹿会不断以高标准提高自己,写出更多有益于读者的学习的方法。

    展开全文
  • 接下来给你介绍21个免费学习写代码的网站,在办公室里或在家里即可轻松学编程。编程初学者必必必必必必!看!马!上!打包收藏这21个免费学习网站精选21个有关代码、编程、Java、Python、SQL、Git、和Ruby on Rails...
  • 大约在1.5年前,我开始自学python编程。...这意味着我已经内化了多数python编程的基本诀窍和模式,现在某些情况下实际依赖写好的例子去写代码。如果你平行学习口语,那么你能够立刻用你新掌握的语言进行...
  •   本人自学前端近半年,js达到熟练的水平,面向对象思想、this指向有一定的了解,但是要用面向对象思想写代码就一脸懵逼了,最近看到某课堂的视频(里面广告嫌疑,就不说是啥了),觉得讲的很好,因此想和大家分享...
  • 高赞已经给出了很多学习的资源,在这里我梳理了学习python基本路线中,每个模块可能遇到的问题和自学需要注意...(2)输入输出刚入门敲代码,一定要学会“通过print进行调试”,我初学时基本上每几行代码就要print...
  • 如何自学图像编程

    2019-09-21 20:40:14
    现在,图像类信息越来越多了...结合我的自学经验,一篇博客谈谈这个问题。需要先明确几个问题:(1)你的基础如何?做图形图像的话,对数学要求比较高,至少要有大学数学的基础——微积分、线性代数、概率统计和数...
  • Visualstadio---如何更舒服的写代码

    千次阅读 2018-06-07 10:52:41
    序言:作为一名技术狂热者,从一开始接触到入门语言-C语言,到老师教会我们VC的使用,再到后来的php培训(纯自学),再...一整个大一的学习,这么多的编程语言,自然而然会用到很多编程软件,习惯于经常一些项目,...
  • 如何度过你的大学,如何自学编程

    千次阅读 多人点赞 2021-03-16 09:23:30
    现在已经是一个写了上10年的老鸟,在武汉的一个互联公司写代码。 萌生自学编程的想法 高考后,由于只够二本,担心热门专业竞争太激烈,于是报考了一个冷门专业,上大学后开始接触电脑,大一每天正常上课,有时间就会...
  • 今天是刘小爱自学Java的第50天。感谢你的观看,谢谢你。话不多说,开始今天的学习: ‍一、Stream流引入这个流和IO流中的流很容易弄混淆。但是它们是两个完全不一样的概念,Stream流是容器处理的简易API,使用起来...
  • 零基础如何自学编程?

    千次阅读 2019-12-21 23:15:26
    接下来给你介绍21个免费学习写代码的网站,在办公室里或在家里即可轻松学编程。 编程初学者必必必必必必!看! 马!上!打包收藏这21个免费学习网站 精选21个有关代码、编程、Java、Python、SQL、Git、和Ruby...
  • 由于近几年来互联网的飞速发展,安卓和iOS平台的大量普及推广,移动开发在...自学之路是一项很苦逼的差事,自学的人很多,但能真正坚持下去的很少,在准备自学Android之前你需要具备以下基本能力能帮助你坚持到最后。
  • 如何自学编程

    2010-03-19 12:20:00
    你也许曾经想过要学习如何开发软件或只是想临时的出一个脚本但不知道如何入手。 幸运的是,现在的互联网上到处都有丰富的学习资源让你能在短时间里成为一个程序员。因为互联网的出现,使程序员们可以通过它讨论...
  • 如何自学C++?

    2013-06-22 11:31:40
    当时自学C++的时候看的是Jesse Liberty的《21天学通C++》。抱着VC把书上所有的代码了一遍,并用调试器跟了一遍。程序代码比较短,也很简练,针对每个知识点都会有一个实例的代码。 我觉得学C++唯一的窍门就是...
  • 如何写模块化的代码

    千次阅读 2016-01-28 15:04:50
    自学CS也有几个月了,既然打算以后靠这个吃饭,就要静下心来学习,走得比一般人更远。  最开始学习时,看到的是语言,语法。后来,就是算法结构之类的技术了。    虽然各种语言,数据结构算法还没有打通关,...
  • 下面我们就以VBA和phthon两个编程语言看看是如何写代码的:VBA在Excel中写九九乘法表这样写:首先打开或新建一个空白excel表,按alt+f11快捷键,进入vba编辑器,新建一个模块,按照下面的语句输入代码。...
  • 如何自学图形图像

    2012-04-09 09:44:15
    结合我的自学经验,一篇博客谈谈这个问题。    需要先明确几个问题:  (1)你的基础如何?做图形图像的话,对数学要求比较高,至少要有大学数学的基础——微积分、线性代数、概率统计和数

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 679
精华内容 271
关键字:

如何自学写代码