上周末刚刚参加完软件设计师中级考试,趁热打铁写一篇详细的总结作为记录,同时和小伙伴分享一下整个复习过程,希望对大家有帮助。
软件设计师考试属于全国计算机技术与软件专业技术资格考试(简称计算机软件资格考试)中的一个中级考试。
考试分为两部分:
1、计算机与软件工程知识,考试时间为150分钟,笔试,选择题;
2、软件设计,考试时间为150分钟,笔试,问答题。
考试合格者将颁发由中华人民共和国人力资源和社会保障部、工业和信息化部用印的计算机技术与软件专业技术资格(水平)证书。证书还中日韩三国互认,人社部和工信部双认证,另外还有一些是软考证书通用的作用,比如积分落户,以考代评,抵扣个税等,大家可以自己查一下,总之,软考证书含金量较高,有一定权威性。
软考主要涉及的科目:
软件工程基础:包括软件工程概述、软件开发模型、软件需求工程、软件设计与实现、软件测试、软件维护等方面的知识。
数据库技术:包括数据库概述、数据库设计、关系数据库理论、SQL语言、数据库管理、数据库应用等方面的知识。
计算机网络技术:包括计算机网络概述、网络协议、网络安全、网络管理等方面的知识。
程序设计语言:包括C、C++、Java、Python等常用的程序设计语言。
操作系统:包括操作系统概述、进程管理、内存管理、文件系统、设备管理等方面的知识。
软件测试:包括测试基础、测试方法、测试工具、测试管理等方面的知识。
软件项目管理:包括项目管理概述、项目计划、项目实施、项目控制等方面的知识。
软件质量保证:包括质量保证概述、质量管理、质量评估、质量改进等方面的知识。
软件需求工程:包括需求获取、需求分析、需求规格说明、需求验证等方面的知识。
软件设计与架构:包括软件设计原则、软件设计模式、软件架构、软件重构等方面的知识。
下面附百度文库提供的考试大纲
链接: 软件工程师考试大纲
计算机专业的同学应该对以上科目和内容都不陌生,如果是非计算机专业的同学想学习以上的内容,最好可以系统的学习一下,毕竟,考证的目的除了证书本身,更多的是学习一些相关知识,建议可以报个计算机专业的自考,除了考试报名费没有其他费用,闲来无事的时候学一学,最后还能拿个国家认可的毕业证书和学位证书。当然,除了以上两点就学不会软考了吗,当然不是,继续往下看文章吧,看完保证你有收获。
除了书本上的知识,还要有一定的编程基础,这里以java为例,可以看下马士兵的j2se视频,也可以找一些比较权威的java基础视频,切记一定要动手敲代码,眼过千遍不如手过一遍。
上下午题中都会涉及到设计模式的题目,这里推荐清华大学出版社出版的图书《大话设计模式》,这本书通篇都是以情景对话的形式,用多个小故事或编程示例来组织讲解GOF(设计模式的经典名著——Design Patterns:Elements of Reusable Object-Oriented Software,中译本名为《设计模式——可复用面向对象软件的基础》的四位作者EIich Gamma、Richard Helm、Ralph Johnson,以及John Vlissides,这四人常被称为Gang of Four,即四人组,简称GoF)总结的23个设计模式。
直接上链接吧,视频针对考点进行讲解,虽然语速很慢,但是讲的还是很不错的。
链接: 软件设计师视频
关于算法和排序我会专门写几篇博客,有兴趣的同学敬请期待。
下面是回溯法-N皇后问题:
链接: 回溯法-N皇后问题
直接插入排序代码
public class InsertSort {
//核心代码---开始
public static void sort(Comparable[] arr){
int n = arr.length;
for (int i = 0; i < n; i++) {
// 寻找元素 arr[i] 合适的插入位置
for( int j = i ; j > 0 ; j -- )
if( arr[j].compareTo( arr[j-1] ) < 0 )
swap( arr, j , j-1 );
else
break;
}
}
//核心代码---结束
private static void swap(Object[] arr, int i, int j) {
Object t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
public static void main(String[] args) {
Integer[] arr = {1,9,6,5,7,6,8,2,4};
sort(arr);
for( int i = 0 ; i < arr.length ; i ++ ){
System.out.print(arr[i]);
System.out.print(' ');
}
}
}
public static void sort(int[] a) {
for (int i = 1; i < a.length; i++) { //a[0]不用排序
int temp = a[i]; //记录待排序元素的值
for (int j = i - 1; j >=0; j--) {
if (temp < a[j]) {
a[j + 1] = a[j];
} else {
break;
}
a[j] = temp;
}
System.out.println("第" + i + "轮排序的结果为" + Arrays.toString(a));
}
}
23个设计模式,每个都画了类图,之前有敲过代码,所以这次没有敲,但是经过这次学习之后,有了完全不一样的感受,打算后面还要再敲一遍代码.同时按照分类每组都进行了二维表的对比。
学习金字塔
费曼学习法
最简单的说法,就是我们经常说的“以教促学”。刚学了一个知识,要想象自己是一个老师:用最简单的话和自己理解的意思给别人讲出来,为了达到这种效果,最好想象你要给一个10岁左右的小孩子去讲,如果小孩子都能听懂,说明你真正掌握了这种方法。
整个学习过程中最有意思收获最多的一个环节就是讨论,学习并不是枯燥的,一定要找小伙伴一起学习,不是互相背知识点,而是互相讲解,多年的老师经验,让我对这点深信不疑,并且屡试不爽,即便没有一同学习的小伙伴,也要“强迫别人听你讲,越没有基础的越好,当你把别人讲通的时候基本上你对知识的掌握已经炉火纯青了。
另外一点,如果你有一个爱提问的小伙伴,恭喜你,你要升级王者了,没人提问,也要自己提问,问题是最好的老师,教是最好的学。而且在与别人讨论的过程中,困扰自己的问题可能小伙伴的一句话就能让你茅塞顿开,醍醐灌顶。
选择一个待完成的任务,将番茄时间设为25分钟,专注工作,中途不允许做任何与该任务无关的事,直到番茄时钟响起,然后进行短暂休息一下(5分钟就行),然后再开始下一个番茄。
所谓结构化。就是把新学的知识和之前学的知识进行联系,去找他们之间的共性,做N+1,没学一个知识都不让它成为孤岛,至于如何进行联系,就要展开你想象的翅膀,用尽毕生所学,总能找到。(当然并不排除一些有意思的“瞎编”,编的过程也是结构化的一种,有机会给大家分享一波“我乱七八糟的结构化”)
就是上面提到的“讨论”,一定要鼓励自己开口。
总结下来,考试成绩似乎已变的不那么重要,重要的是整个学习过程,同时也给我后面的学习提供了很多的方向指导,比如,设计模式还需要进一步的学习,每次学习不一样的发现会给自己带来愉悦,还有算法的学习,每个小小的循环都有大不一样的含义,每个基础知识的学习对于后面的提高都有着不可忽视的地基作用。
最后还是以一首陆游的诗结束今天的总结:
冬夜读书示子聿
古人学问无遗力,少壮工夫老始成。
纸上得来终觉浅,绝知此事要躬行。