编程

好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。

送分小仙女□ 提交于 2020-03-16 18:58:31
某厂面试归来,发现自己落伍了!>>> 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。 差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行” 做程序员的经历让我知道了一些关于软件编程的事情。下面的这些事情可能会让朋友们对软件开发感到惊讶: 1. 一个程序员用在写程序上的时间大概占他的工作时间的10-20%,大部分的程序员每天大约能写出10-12行的能进入最终的产品的代码 — —不管他的技术水平有多高。 好的程序员花去90%的时间在思考、研究和实验,来找出最优方案。差的程序员花去90%的时间在调试问题程序、盲目的修改程序,期望某种写法能可行。“一个卓越的车床工可以要求比一个一般的车床工多拿数倍高的工资,但一个卓越的软件写手的价值会10000倍于一个普通的写手。”——比尔 盖茨 2. 一个优秀的程序员的效率会是一个普通的程序员的十倍之上。一个伟大的程序员的效率会是一个普通程序员的20-100倍。这不是夸张 — — 1960年以来的无数研究都一致的证明了这一点。一个差的程序员不仅仅是没效率 — — 他不仅不能完成任务,写出的大量代码也让别人头痛的没法维护。 3. 伟大的程序员只花很少的时间去写代码——至少指那些最终形成产品的代码。那些要花掉大量时间写代码的程序员都是太懒惰,太自大,太傲慢,不屑用现有的方案去解决老问题。伟大的程序员的精明之处在

爱上Java的10大理由

假如想象 提交于 2020-03-12 19:57:05
版权声明: 本文为北京尚学堂原创文章,未经允许不得转载。 Java和JVM已经存在了很长一段时间了,基于这个事实,一些程序员开始将很多事情视为理所当然。今天我们就来说一说“Java之所以能够成为并将继续是软件项目领先平台”的十大理由。 1.高性能JVM Java最初的开发目的“一次编写到处运行”,并由虚拟机提供运行平台。没有JVM,Java就必须遵循Ruby和Python的步伐——在痛苦中进一步提高其便携性。随着物联网的出现,一个强大的虚拟机变得越来越重要。 2.核心API 最让人喜欢的就是Java核心API——从它诞生之后就可以完全向后兼容,这样我们就可以开始写更多的Java应用。虽然有无数额外的库和JVM语言可以提供简洁的语言水平,以获取多种核心API功能,但其中大部分实际上是依赖于Java核心API的支配。虽然也有其他语言纷纷效仿,但很少能像Java保持得如此稳定。更多精彩内容关注微信公众号:北京尚学堂。 3.编译器 还有很多值得欣赏的Java编译器——将你的源代码转换成字节码,然后再成为可执行文件——更由于JIT的出现,将其他的直译程式比到了尘埃里。并且天生简洁的Java编译器能让开发人员只需将注意力放在代码上,而无需关注编译器架构。 4.字节码 和编译器一样,在Java字节码中,简单才是王道。它可以大大降低了写出潜在错误代码的几率。并且也不需要第三方字节码操作工具

北京尚学堂|Java程序员面试失败的5大原因

人走茶凉 提交于 2020-03-10 10:28:09
下面是北京尚学堂总结:Java程序员面试失败最有可能的5大原因,当然也许这5点原因适用于所有的程序员,所以,如果你是程序员,请认真阅读以下内容。​ 1、 说得太少​ 说得太少​ 尤其是那些开放式的问题,如“请介绍下你自己”或“请讲一下你曾经解决过的复杂问题”。面试官会通过你对这些技术和非技术问题的回答来评估你的激情。他们也会通过模拟团队氛围和与你的交流互动来判断你的经验和能力。 所以,仅仅只用两三句话来回答不但不能显示出你对这个专业的兴趣,还会让整个面试过程显得非常无聊。如果你不能很好地说明你的经验、成就和技能可以给企业带来的价值,那么你的竞争力毫无疑问就高不起来。所以,你需要对一些最常见的开放式问答作充分的准备,学会推销自己。更多精彩内容关注微信公众号:北京尚学堂。 2 、说得太多 说得太多 不断地说,不断地说,却并没有什么实质性的内容。换句话说,就是废话连篇,言之无物。如果你不能简洁的解释问题,那么面试官就会怀疑你在工作时的表现是不是也会像你的谈话一样拖泥带水?可以先问问面试官,确定是否真的需要详细解释。 解释也是一门艺术,关键是确定重点,如果需要的话再深入到细节。当聊到业务的时候,就应该从业务的角度看问题,不要涉及任何技术术语。学会用简洁明了的方式解释问题。如果你能时刻把握主旨,那么这一点也不是问题。 3、 回答不出一些必知的基本技术问题 回答不出一些必知的基本技术问题

【答疑解惑】Java类的加载顺序

早过忘川 提交于 2020-03-08 20:19:18
版权声明: 本文为北京尚学堂原创文章,未经允许不得转载。 Java类的初始化顺序这个问题经常出现在面试题中,这个面试题设计的知识有类、对象、static关键字、初始化函数、类的加载顺序,咱们一个一个来说。 类: 类描述了具有相同特性(数据元素)和行为(功能)的对象集合,也是一个数据类型。比如说动物,它有重量、大小的特征(数据元素),也有移动、吃的行为(功能)。 对象: 对象是具有状态、行为和标识的是上面类的一个实例。每一个对象都有内部数据(它描述该对象的状态)和方法(它产生行为),并且每一个对象都可以与其他对象区分开来,就是一个对象在内存中都有一个唯一的地址。在Java中对象都必须通过new来产生。更多精彩内容关注微信公众号:北京尚学堂。 static: static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。它是属于类不属于对象。 初始化函数: 也就是构造器,构造器名称必须与类名完全相同,没有返回值。没有参数的构造器叫做默认构造器,你在不重载情况下都是调用的默认构造器。更多精彩内容关注微信公众号:北京尚学堂。 类的加载顺序: static块和对象:无论写在类的前面还是后面都会先执行,多个静态块或者对象执行顺序与写的顺序一致,写在前面的先执行; 非静态块和对象:按照在类中写的先后顺序执行; 初始化函数;​​ 如果你的目标是就业

【原创翻译】如何命名变量

感情迁移 提交于 2020-03-03 00:48:28
恰当地命名变量,是软件开发的重要组成部分。变量名称必须由字母开头,其后可以含有字母、数字和_(下划线)。Go编译器并不关注你怎么命名变量,它的命名方式只对你(或其他人)有意义。尽可能地选择贴近变量含义的名称。假设有如下代码: x := "Max" fmt.Println("My dog's name is", x) 在这个例子中,x不是一个很好的变量名称。更好的名称也许是: name := "Max" fmt.Println("My dog's name is", name) 甚至: dogsName := "Max" fmt.Println("My dog's name is", dogsName) 在最后一个例子中,我们利用了“驼峰式”变量名来连接多个单词。第一个单词的首字母是小写,其后单词的首字母是大写,其他所有字母都是小写。 原文地址: http://www.zingscript.com/translate/golang-book 来源: oschina 链接: https://my.oschina.net/u/1441707/blog/196173

【原创翻译】数值(number)

北城以北 提交于 2020-03-03 00:47:55
Go有很多种表示数值的类型。通常来说,我们将数值分成两类:整数和浮点数。 整数 整数——跟数学意义上的整数一样——没有小数部分(...,-3,-2,-1,-,1,2,3,...)。但不像我们用10进制表示整数,计算机用2进制表示。 我们十进制系统又10种数字位组成。当一个位上的10种数字位都表示完了,我们在下一位上用更大的数字进位。比方说9后面是10,99后面是100。计算机的做法也一样,但它们没有10个数字位,只有2个。所以计算机的计数会像这样:0、1、10、11、100、101、110、111,如此类推。另一个不同之处是,计算机里所有的整数都有一个明确的尺寸。它们只为确定位数的数据分配空间。所以4位的整数看起来会像:0000、0001、0010、0011、0100。当空间不够用的时候,计数将循环,从头计算(会发生很些很奇怪的行为)。 Go的整数类型有:uint8、uint16、uint32、uint64、int8、int16、int32和int64。8、16、32、64告诉我们每种类型的位数。uint的意思是“无符号整数”,而int是“有符号整数”。无符号整数只包含零和正整数。除此还有两种类型的别名:byte跟unit8是一样的,rune跟int32是一样的。字节(byte)是计算机中极普遍的衡量单位(1 byte = 8 bits,1024 bytes = 1

【原创翻译】布尔值(boolean)

孤人 提交于 2020-03-03 00:47:36
布尔值(以George Boole的名字命名)代表一位整数,用来表示真或者假(开或者关)。布尔值有三种逻辑运算符: && 与 || 或 ! 非 以下是一个使用例子: func main() { fmt.Println(true && true) fmt.Println(true && false) fmt.Println(true || true) fmt.Println(true || false) fmt.Println(!true) } 运行这个程序将会输出: $ go run main.go true false true true false 我们常使用真值表来定义运算符的结果: 表达式 值 true && true true true && false false false && true false false && false false 表达式 值 true || true true true || false true false || true true false || false false 表达式 值 !true false !false true 最简单的类型都被包含在了Go语言中,形成了建立后续类型的基础。 原文地址: http://www.zingscript.com/translate/golang-book 来源: oschina 链接:

【原创翻译】字符串(string)

 ̄綄美尐妖づ 提交于 2020-03-03 00:42:22
正如我们第二章提到的,字符串是一组具有特定长度的、描述文本的字符序列。通常来说,字符串里的字符各占用一个字节(如中文之类的其他语言的字符占用一个以上的字节)。 字符串字面量由双引号"Hello World"或者反引号`Hello World`创建。它们的区别在于,双引号不能换行但可以有特殊字符转移。比方说\n会被替换成换行,而\t会被替换成制表符。 常用的字符串操作包括获取字符串长度:len("Hello World") ,获取字符串中的特定字符:"Hello World"[1],将两个字符串连接起来:"Hello "+" World"。让我们修改之前的程序来做个测试: package main import "fmt" func main() { fmt.Println(len("Hello World")) fmt.Println("Hello World"[1]) fmt.Println("Hello " + "World") } 需要注意以下事情: 空格也占用字符,所以字符串的长度是11而不是10,打印的第三行是"Hello "而不是"Hello"。 字符串的字符从0开始索引,而不是1。[1]以为着取第二个元素,而不是第一个。当你运行程序的时候,你会注意到你看见的是101而不是e。这是因为字符是用字节表示的(字节是整数型的)。 有一种表示字符串索引的方式:"Hello

唠唠SE的集合-09——Map接口

时光怂恿深爱的人放手 提交于 2020-03-02 03:11:58
9. Map 将键映射到值的对象,一个映射 不能包含重复的键 ,但 值可以重复 。 每个键最多只能映射到一个值 。 Map是 双列 的;Collection是 单列 的 Map的 键唯一 ;Collection的子体系 Set是唯一的 Map集合的数据结构 只针对键有效 ,跟值无关;Collection集合的数据结构是 针对元素有效 1、添加: 1、V put(K key, V value) (可以相同的key值,但是添加的value值会覆盖前面的,返回值是前一个,如果没有就返回null) 2、putAll(Map<? extends K, ? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。 import java.util.HashMap; import java.util.Map; public class Test { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("胖虎", 10); map.put("小夫", 99); map.put("大雄", 0); Map<String, Integer> map2 = new HashMap<>(); map2.putAll(map); } } 2、删除 1

唠唠SE的集合-08——TreeSet

£可爱£侵袭症+ 提交于 2020-03-02 03:11:41
8. TreeSet 使用元素的自然顺序对元素进行 排序 ,或者根据创建set时提供的Comparator进行排序。 底层数据结构是 红黑树 (红黑树是一种自平衡的二叉树,特点是左大右小) 有关红黑树的知识,戳: 红黑树 , 或者: 最容易懂的红黑树 我们在HashSet里写过一个Person,那我们直接拿来存到TreeSet里吧: import java.util.TreeSet; public class Test { public static void main(String[] args) { TreeSet<Person> set = new TreeSet<>(); set.add(new Person(1, "辣条")); set.add(new Person(3, "冰棍")); set.add(new Person(4, "面包")); set.add(new Person(2, "薯片")); set.add(new Person(2, "薯片")); set.add(new Person(2, "薯片")); for (Person person : set) { System.out.println(person); } } } class Person { public int id; public String name; public Person