├── C.md ├── OOP设计原则.md ├── OS.md ├── README.md ├── Rails.md ├── Ruby笔试题.md ├── Ruby线程.md ├── diigo_interview_questions.md ├── ruby设计模式.md ├── source ├── C语言 │ └── bitwise.c ├── OS │ ├── condition_variable.rb │ ├── multi-thread.rb │ ├── multi-thread_web_server.rb │ ├── mutex.rb │ └── queue.rb ├── Ruby面试题 │ ├── CelsiusToFahrenheit.rb │ └── 方法访问权限.rb └── 数据结构与算法复习 │ ├── binary_search.rb │ └── yanghuisanjiao.rb ├── 名人故事.md ├── 唱吧面试.md ├── 团队方面的问题.md ├── 常用Rails命令收集.md ├── 常用gem.md ├── 敏捷开发.md ├── 数据结构与算法复习.md ├── 杭州阿里巴巴电话面.md ├── 活跃网络(ActiveNetwork)面试.md ├── 测试.md ├── 用户体验.md ├── 百度电话面试.md ├── 面试常见问题.md └── 项目,产品面试(非技术).md /C.md: -------------------------------------------------------------------------------- 1 | * 十进制整数转换为二进制整数采用"除2取余,逆序排列"法。 2 | 具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 3 | * 二进制数转换为十进制整数采用"按权展开求和" 4 | 5 | -------------------------------------------------------------------------------- /OOP设计原则.md: -------------------------------------------------------------------------------- 1 | ## 学习教材: 2 | * [Head First 设计模式(中文版)](http://book.douban.com/subject/2243615/) 3 | * [Ruby设计模式](http://book.douban.com/subject/3338834/) 4 | * [设计模式(GoF四人书)](http://book.douban.com/subject/1052241/) 5 | 6 | ## 纲要 7 | * 不重复原则DRY(Don't repeat yourself) 8 | * 开放封闭原则 9 | * 单一职责原则 10 | * 依赖注入或倒置原则 11 | * 里氏代换原则 12 | * 接口隔离原则 13 | * 封装变化 14 | * 优先利用组合而非继承 15 | * 针对接口编程,而不是针对实现编程 16 | * 委托原则 17 | * 低耦合、高内聚 18 | 19 | ## 部分说明   20 | > OOP设计原则主要提供了一个方向,使得我们的程序设计得更加合理,从而获得更好的可扩展性、可维护性。主要包括以下几个原则: 21 | 22 | * **OCP(Open-Closed Principle) 开放封闭原则** 23 | 对扩展开放,对修改关闭。即在不修改原有程序源码的情况下对其进行扩展。实现开闭原则的关键就在于“抽象”。 “作为系统设计的抽象层,要预见所有可能的扩展,从而使得在任何扩展情况下,系统的抽象底层不需修改;同时,由于可以从抽象底层导出一个或多个新的具体实 现,可以改变系统的行为,因此系统设计对扩展是开放的。 ” 这个原则是OOP的基石,其他原则主要来实现本原则。 24 | 25 | * **SRP (Simple Responsibility Pinciple)单一职责原则** 26 | 一个类一般应该设计成只有一个职责,如果设计成具备很多职责,那么任何一个职责的改变都会引起这个类的修改,相关引用该类的代码也可能受到影响。不同的职责或功能应该由不同的类来实现,这样可以很好的控制变化带来的影响粒度。 27 | 28 | * **DIP (Dependence Inversion Principle) 依赖倒转原则** 29 | 抽象不应该依赖于实现细节,实现细节应该依赖于抽象;高层不应该依赖于底层,都应该依赖于抽象。针对接口编程: 应该用接口或者抽象类声明变量、方法参数、方法返回类型等。 30 | 31 | * **(Liskov Substitution Principle)里氏代换原则** 32 | 子类型完全可以替换父类型,而不需要任何修改,并且获得期望的结果。 33 | 34 | * **ISP (Interface Segregation Principle)接口隔离原则** 35 | 客户端不应该可以访问不需要的方法,这些不需要的方法是一种有害的耦合性。 36 | 所以应该设计多个专门接口而不是单个复杂的接口,客户端仅依赖最小的接口类型。 37 | 38 | * **CARP (Composite/Aggregate Reuse Principle)合成/聚合复用原则** 39 | 多聚合、少继承,实现复用性。聚合的复用是一种封闭性的复用,被复用者对复用者隐藏了自身细节,而继承是一种开放性的复用,子类可以获取父类型相关的细节,破坏了封闭性。 40 | -------------------------------------------------------------------------------- /OS.md: -------------------------------------------------------------------------------- 1 | * [绿色线程(Green Thread)和操作系统线程(Native Thread)](http://blog.csdn.net/perfe_ct/article/details/6704995) 2 | 内核线程(也叫"原生线程[native threads]") 3 | 4 | * 线程和进程 5 | [操作系统中的进程与线程](http://www.cnblogs.com/CareySon/archive/2012/05/04/ProcessAndThread.html) 6 | Ruby中线程可查看 7 | 实现文章的LiveWriter的例子 8 | 9 | * [进程与线程状态](http://tanteng.sinaapp.com/2011/10/state/) 10 | * 就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。 11 | 例如,当一个进程由于时间片用完而进入就绪状态时,排人低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列 12 | * 运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。 13 | 在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程 14 | * 阻塞状态(Blocked):当进程由于等待I/O操作或进程同步等条件而暂停运行时,它处于阻塞状态 15 | 16 | * Ruby中实现线程同步 17 | [Link1](http://blog.csdn.net/weixingstudio/article/details/7797509) 18 | 19 | * 互斥(Mutual Exclusion) 每个希望访问共享数据的线程首先必须对数据加锁,锁用Mutex对象表示 20 | example: source/OS/mutex.rb 21 | 22 | * 条件变量(Condition Variables) 23 | example: source/OS/condition_variable.rb 24 | 25 | * 监管数据交接的Queue 当队列为空时,dep方法会阻塞 26 | example: source/OS/queue.rb 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | interview_summarize 2 | =================== 3 | 4 | @simlegate 和 @byronlee 面试总结 5 | -------------------------------------------------------------------------------- /Rails.md: -------------------------------------------------------------------------------- 1 | * Rails分层架构 2 | * Rails的业务逻辑在代码层面应该怎么处理 3 | * 应该怎样配合不懂Rails的前台开发人员协作开发 4 | -------------------------------------------------------------------------------- /Ruby笔试题.md: -------------------------------------------------------------------------------- 1 | * [ruby面试题+笔试题](http://www.mianwww.com/html/category/it-interview/ruby) 2 | * [ruby笔试题](http://www.jobui.com/mianshiti/it/ruby/?n=1) 3 | * Ruby中的对象模型 ??? 4 | 5 | * Ruby Array和Hash常见方法使用 ??? 6 | 7 | * Ruby中类和模块的区别 8 | * 模块和类的区别在于,模块不能实例化,类不能include 9 | 10 | * [instance_eval 和class_eval 区别](http://ruby-china.org/topics/2442) 11 | * class_eval针对类来说,就好像打开class操作一样,和class关键字所作的一样 12 | * instance_eval 打开instance的单例类 13 | 14 | * [Ruby中的字符串与符号](http://blog.csdn.net/besfanfei/article/details/7966987) 15 | * 字符串和符号,都是Ruby中表示文本的方式 16 | * 相同的符号是一个对象,相同的字符并不一定是一个对象 17 | * 处理符号相比字符串,占用更少的资源 18 | 由于字符串变量必须具有各种修改其内容的功能,所以字符串的维护和处理的开销就很大 19 | 20 | * [==, ===, equal?, eql? 的区别](http://darkbaby123.iteye.com/blog/604678) 21 | * obj == other_obj -> true or false 22 | 在Object类层面,这个方法是判断obj和 other_obj是不是同一个对象(可以理解为两者的object_id一定要相同)。但通常子类都会重写 == 方法来加入自己的比较逻辑。虽然每个子类都对此有不同的实现,但常见的作用就是比较两个对象的值是否相同。 23 | * obj === other_obj -> true or false 24 | 主要用于case语句中的比较。效果和 == 一样,但一般会被子类重写,来适应case语句的需要。很典型的就是正则表达式的 === 方法。 25 | * obj.equal? (other_obj) -> true or false 26 | 判断obj和other_obj的object_id是否相同。子类不会重写这个方法。所以它的效果在任何对象中都是一样的 27 | * obj.eql? (other_obj) -> true or false 28 | 判断obj和other_obj的值是否相同。和 == 差不多,但有些细微区别,比如Numeric类型,1.eql?(1.0) 是返回 false 的,因为两者类型不同,而 == 则会做类型转换再比较。 29 | 30 | * [Array#to_a, Array#to_ary 的区别](http://darkbaby123.iteye.com/blog/604678) 31 | * arr.to_ary -> ary 32 | 这个方法很简单,直接返回方法调用者。返回值和原对象没有区别。 33 | * arr.to_a -> arr 34 | 这个方法复杂一点。首先,当arr是Array的实例时,直接返回arr;当arr是Array子类的实例时,会先使用 to_ary 获得一个数组,然后根据这个数组创建一个新数组(就是复制)返回。 35 | 36 | * [kind_of?, is_a?, instance_of? 的区别](http://darkbaby123.iteye.com/blog/604678) 37 | * obj.kind_of? (klass) -> true or false 38 | 判断klass是否是obj的类,或者obj类的超类,或者obj类被mixin的模块 39 | * obj.is_a? (klass) -> true or false 40 | 和kind_of? 一样 41 | * obj.instance_of? (klass) -> true of false 42 | 判断obj是否是由klass生成的实例 43 | 44 | * Ruby主要数据结构以及特点 45 | * Set 46 | Set实现了由若干个无序且不重复的对象所组成的集合的功能。它既包含Array的运算功能,同时又兼有Hash的高速搜索功能。 47 | * Array 48 | 数组的元素可以是任意的Ruby对象 49 | * Hash 50 | 通过哈希表,您可以将一个任意类型的对象同另一个任意类型的对象联系起来 51 | 52 | * Ruby文件操作 53 | * File.new 54 | * File.open 55 | * file.puts #写入内容 56 | * Dir['/home/simlegate'].each {|x|p x} #查找目录下所有文件及文件夹 57 | 58 | * Ruby优缺点 59 | * 优点: 60 | 1. Ruby是解释型语言,其程序无需编译即可执行 61 | 2. 语法简单、优雅 62 | 3. 完全面向对象.Ruby从一开始就被设计成纯粹的面向对象语言,因此所有东西都是对象,例如整数等基本数据类型 63 | 4. 跨平台和高度可移植性.Ruby支持多种平台,在Windows, Unix, Linux, MacOS上都可以运行。Ruby程序的可移植性非常好,绝大多数程序可以不加修改的在各种平台上加以运行 64 | 5. 拥有很多高级特性.Ruby拥有很多高级特性,例如操作符重载、Mix-ins、特殊方法等等,是用这些特性可以方便地完成各种强大的功能 65 | * 缺点: 66 | 1. 解释型语言,所以速度较慢 67 | 68 | * [gets和gets.chomp(去掉每一个元素尾部的换行符)的区别](http://chita.blog.51cto.com/2536781/717737) 69 | * gets在取得输入的值后自动加上'\n'换行符 70 | * gets.chomp则反之 71 | 72 | * ruby实现华氏到摄氏的转换 73 | 二者间的换算公式如下: 74 | 1.摄氏℃ =5/9 ×(°F-32) 75 | 例如,将华氏90度换算成摄氏度数 76 | 5/9 ×(90- 32)= 5/9 × 58= 32.2 77 | 即:华氏90度等于摄氏32.2度。 78 | 2.华氏°F=℃ × 9/5+32 79 | 例如,将摄氏30度换算成华氏度数 80 | 30×9/5+32=54+32=86 81 | 即:摄氏30度等干华氏86度。 82 | 83 | 代码:source/Ruby面试题/CelsiusToFahrenheit.rb 84 | 85 | * puts,p,print的区别 86 | * puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号);另外如果内容参数中有转义符,输出时将先处理转义再输出 87 | * p 基本与puts相同,但不会处理参数中的转义符号 88 | * print 基本与puts相同,但输出内容后,不会自动在结尾加上换行符 89 | 90 | * [Ruby方法访问权限](http://blog.csdn.net/magneto7/article/details/9150445) 91 | * **public** 可以被任何实例对象调用,不存在访问控制; 92 | * **protected** 可以被定义它的类和其子类访问,可以在类中或子类中指定给实例对象; ???? 93 | * **private** 可以被定义它的类和其子类访问,不能被实例对象调用。 94 | 不能有显式调用,也就是不能有接受者,不能self.define_method这样调用 95 | 私有方法是可以被继承的 96 | 私有方法可以被send强制调用,如:send(:private_method) 97 | 方法默认都是公有的(initialize方法除外,它永远是私有的) 98 | 99 | 代码:source/Ruby面试题/方法访问权限.rb 100 | 101 | * Ruby 的所有时间对象都可像数字一样用在值域中。Date和DateTime对象按天递增,而Time对象按秒递增 102 | * Ruby单件方法和单件类(单件的别名特殊) 103 | 104 | * [File.open和File.new的区别](http://blog.csdn.net/zl728/article/details/4994718) 105 | * File.open后不接代码块和File.new效果一样 106 | * 反之,File.open在发生异常时会自动关闭file 107 | * 反之,File.open返回的结果为代码块的值 108 | 109 | * [include和extend的区别](http://vincent253.iteye.com/blog/135213) 110 | * include主要用来将一个模块插入(mix)到一个类或者其它模块。 111 | * extend 用来在一个**对象**(object,或者说是instance)中引入一个模块,这个对象从而也具备了这个模块的方法,而且是对象的单例方法。 112 | s = 'simlegate' ; s.extend(M) # => M中的方法编程s的单例方法 113 | 114 | * require,load,autoload的区别 115 | * require可载入某个a.rb文件,且可以省略".rb",而且它只会在第一次的时候载入,若再次"require"时就会忽略 116 | * load载入时需要用a.rb全名, 且每次一定会重新载入 117 | * autoload 是只有需要的时候才会用上。 118 | 119 | * 用过哪些元编程技术 120 | * 闭包 121 | * 打开类 122 | * [define_method](http://anleb.iteye.com/blog/1613912) define_method是Object的私有类方法,也就是只有类才可以调用 123 | * 说明define_method定义的方法和def定义没区别,都可以被继承 124 | * define_method的方法是存在于类中的实例方法 125 | 126 | * Ruby格式化输出 127 | "%d %s" % [2,'simlegate'] # => "2 simlegate" 128 | 129 | * Ruby的语法都是面向表达式,都会返回值 130 | 比如if控制结构 131 | 132 | * 感叹号方法调用 133 | 不带感叹号的方法返回调用该方法的对象的一个**修改过的拷贝**,而带感叹号的方法则是一个可变方法,该方法会**修改原对象**。 134 | 135 | * Ruby很轻松地支持多种编程范例 136 | * 纯粹的面向对象的类型 137 | * 面向过程范式 138 | 开发人员可以在任何类或者函数外面编写代码,也可以在任何类外面编写函数。(Ruby悄悄把这些函数添加到了“对象”类,在后台维持面向对象的特性。) 139 | * 函数式范式 140 | -------------------------------------------------------------------------------- /Ruby线程.md: -------------------------------------------------------------------------------- 1 | 2 | # ruby 多线程 3 | 4 | Ruby的多线程是用户级多线程,这样使得Ruby的多线程移植非常容易 5 | Thread类由Ruby解释器具体实现,提供了一种同时处理多个任务的方法, Thread类实现的并不是操作系统级多线程。 6 | 你并不需关心具体的操作系统;这样做也使线程容易控制,程序不容易产生死锁这类严重的线程问题。 7 | 8 | 但是同时,由于Ruby的多线程并不是真正意义上的操作系统级多线程,不管代码使用了多少个Thread类的实例, 9 | 都只会在启动解释器这一个进程内执行 10 | 由Ruby解释器进行具体的线程切换管理,其效率要低于由操作系统管理线程的效率,且不能使用多个CPU。 11 | 12 | 在Ruby中同时做多件事最简单的方式就是使用Thread类,Thread类提供了一种高效和轻量级的手段来同时处理多件任务。 13 | 14 | # 优缺点 15 | * 缺点是效率不如操作系统级多线程,不能使用多个CPU, 16 | * 即可移植性很高。这就需要设计人员综合考虑。 17 | * Web 应用大多是 IO 密集型的,利用 Ruby 多进程+多线程模型将能大幅提升系统吞吐量。 18 | * 其原因在于:当Ruby 某个线程处于 IO Block 状态时,其它的线程还可以继续执行。 19 | 20 | 21 | # 实现 22 | 可以使用Thread.new方法去创建一个线程,可以随后代码块中列出线程执行的代码: 23 | 24 | ```ruby 25 | x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” } 26 | a = Thread.new { print “a”; print “b”; sleep 0.2; print “c” } 27 | ``` 28 | 29 | 执行结果为: 30 | ```ruby 31 | ab 32 | ``` 33 | 34 | 上面的示例程序中使用Thread.new创建了二个线程,线程随即开始运行。 35 | 但是运行结果很奇怪,为什么程序运行结果是“ab”呢?我们预期的执行结果应该是 “abxyzc”。 36 | 37 | 当Ruby程序执行完毕的时候,他会杀掉所有的线程,不管其它的线程的运行状态如何。 38 | 如果没有使用join方法,那么主程序执行完毕后会把所有没有执行完毕的线程杀掉。 39 | 上面的实例程序中,当主程序运行完毕时,两个线程都没有运行结束就被中止掉了。 40 | 我们可以使用join方法来让主程序等待某个特定线程结束,对每一个线程使用join方法,可以确保在程序结束前所有的线程可以运行完毕。 41 | 42 | ```ruby 43 | x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” } 44 | a = Thread.new { print “a”; print “b”; sleep 0.2; print “c” } 45 | x.join 46 | a.join 47 | ``` 48 | 我们使用Thread.new方法创建两个新的线程并开始运行, 然后使用join方法等待线程结束。执行结果为: 49 | ```ruby 50 | abxyzc 51 | ``` 52 | 可以看到通过使用join方法等待线程结束,程序运行结果和我们预期结果相符。 53 | 54 | 另一个例子: 55 | ```ruby 56 | x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” } 57 | a = Thread.new { sleep 0.1; print “a”; print “b”; sleep 0.2; print “c” } 58 | ``` 59 | 执行没有任何输出,因为主程序执行完毕杀死两个线程的时候这两个线程没有运行到输出语句。 60 | 61 | 也可以给join方法添加时间用来指明最大等待时间。如果超时join返回nil。 62 | ```ruby 63 | x = Thread.new { sleep 0.1; print “x”; print “y”; print “z” } 64 | a = Thread.new { sleep 0.1; print “a”; print “b”; sleep 10; print “c” } 65 | 66 | x.join(5) 67 | a.join(5) 68 | ``` 69 | 执行结果为: 70 | 71 | abxyz 72 | 73 | 上面的例子中对于每一个线程的最大等待时间是5秒,由于a线程需要执行10秒以上,所以a线程没有运行完毕程序就将返回。 -------------------------------------------------------------------------------- /diigo_interview_questions.md: -------------------------------------------------------------------------------- 1 | # diigo.com interview questions 2 | 3 | @Byronleee 4 | 5 | * 熟悉该公司哪些产品,并提改进意见 6 | * 的对人生的规划 7 | * 自己最擅长什么 8 | * 目前你用的最爽的手机APP有哪些?爽在哪里? 9 | * 对系统的性能优化,处理高并发你有哪些方案? 10 | * 对比佛道两家的特点 11 | * 佛教对你的有哪些影响?谈谈你对它的认识 12 | * 说说你了解的js原型继承 prototype 13 | * nodejs的优点,为什么能有这样的优点?适合用哪些场合 14 | * 平时都干些什么? 15 | * 你最拿手的几个创新 16 | * 不用css3,用html,css2实现圆角,你有几种方案? 17 | * 对比rails3 rails4, 说说rails在哪些方面提升了? 18 | * rails4参与了多线程,这样有哪些好处? 19 | * 进程和线程的区别? 20 | * rails中你有哪些方式处理邮件超时? 21 | * 观擦者(observer)这样的模式,有什么好处 22 | * rails中时间异常怎么样捕获? 23 | * 晒一下你觉得最酷的代码片段 24 | 25 | @simlegate 26 | 27 | * Ruby中你常用的元编程 28 | * 反射机制 29 | * 动态方法调用 30 | * 动态定义方法 31 | * 闭包 32 | * 打开类 33 | 34 | * 数据库方面的知识,mongodb有哪些优点,速度快在哪里? 35 | * nginx实现并发的原理 36 | * Ruby基础语法题目 ??? 37 | 38 | ```ruby 39 | x = 2 if defined? x # => 2 40 | 41 | if defined? x 42 | x = 2 43 | end 44 | # => x = nil 45 | ``` 46 | 47 | * Rails包管理 48 | * Rails的优点以及缺点 49 | * Rails每次升级API变动都比较大 50 | * 特别容易出现命名冲突 51 | * DDD/BDD/TDD区别,rspec和cucumber属于哪种测试? 52 | * 为什么选择vim,vim与emacs有哪些区别,vim有哪些好用的插件(目前我用来rails,markdown插件) 53 | * 较好的扩展性 54 | * 编辑文本速度快 55 | * 按键更简洁,通常是单个字 符按键,就实现某种操作 56 | * git比较svn 57 | * 了解敏捷开发 58 | * 围绕自己做的项目会问许多的问题,包括系统架构,系统出现性能问题该如何解决,如何进行系统优化啊 59 | * github上自己感兴趣的项目,或者哪断代码让你印象深刻 60 | * 平时都在github做些什么事? 61 | * 喜欢折腾Linux,平时都怎么折腾? 62 | * 配置shell命令,跳转到rails根目录下面 63 | * 学习vim操作 64 | * 发现使用的shell脚本 65 | * 配置开发环境,尽可能少的切换 66 | * 技术论坛上比较感兴趣的话题 67 | * 谈谈你对IT产业的未来 68 | * 为什么计划学习函数式编程语言 69 | * 高并发 多核 70 | * 越来越多的语言向其靠近 71 | * 目前已经阅读了哪些书籍 72 | * Ruby编程语言 73 | * Ruby元编程 74 | * 为什么选择Linux作为开发环境 75 | * 除了编程之外你还喜欢干什么? 76 | * Ruby只要的数据结构 77 | * Ruby中类和模块的区别 78 | * 自己的优缺点 79 | * 自己的职业规划 80 | -------------------------------------------------------------------------------- /ruby设计模式.md: -------------------------------------------------------------------------------- 1 | ### 参考ruby设计模式一书上面所有的例子,详情代码请见代码仓库: 2 | * [ruby设计模式](git@github.com:Byronlee/Design-patterns-in-ruby.git) -------------------------------------------------------------------------------- /source/C语言/bitwise.c: -------------------------------------------------------------------------------- 1 | /* http://www.xl7788.com/zt/computerprogram/CBit.html */ 2 | /** 3 | * & 两者都是1结果为真。 其中一个为0结果为假 4 | * | 两者都是0结果为假。其它情况都为真。 5 | * ^ 相同就为假,不同为真。 6 | * ~ 取反运算简单讲就是0变1,1变0。 7 | * >> 将二进制的位整体向右移动。 8 | * << 将二进制的位整体向左移动。 9 | */ 10 | main() { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /source/OS/condition_variable.rb: -------------------------------------------------------------------------------- 1 | # encoding:utf-8 2 | require "thread" 3 | 4 | puts "thread synchronize by ConditionVariable" 5 | 6 | mutex = Mutex.new 7 | resource = ConditionVariable.new 8 | 9 | a = Thread.new { 10 | mutex.synchronize { 11 | # 12 | # 这个线程目前需要resource这个资源 13 | # 为了让一切正常工作,等待线程必须给wait方法传递一个上锁的Mutex对象 14 | # 在这个线程等待过程中,这个Mutex对象会暂时解锁,而在线程唤醒后重新上锁 15 | # 16 | resource.wait(mutex) 17 | puts "get resource" 18 | } 19 | } 20 | 21 | b = Thread.new { 22 | mutex.synchronize { 23 | #线程b完成对resourece资源的使用并释放resource 24 | resource.signal 25 | puts "free resource" 26 | } 27 | } 28 | 29 | a.join 30 | puts "complete" 31 | -------------------------------------------------------------------------------- /source/OS/multi-thread.rb: -------------------------------------------------------------------------------- 1 | def thread_1 2 | i = 0 3 | while i <= 2 4 | puts "Thread 1 At #{Time.now}" 5 | sleep(2) 6 | i = i + 1 7 | end 8 | end 9 | 10 | def thread_2 11 | j = 0 12 | while j <= 2 13 | puts "Thread 2 At #{Time.now}" 14 | sleep(2) 15 | j = j + 1 16 | end 17 | end 18 | 19 | puts "Started At #{Time.now}" 20 | t1 = Thread.new {thread_1} 21 | t2 = Thread.new {thread_2} 22 | t1.join 23 | t2.join 24 | puts "End At #{Time.now}" 25 | 26 | -------------------------------------------------------------------------------- /source/OS/multi-thread_web_server.rb: -------------------------------------------------------------------------------- 1 | require 'thread' 2 | require 'socket' 3 | 4 | class RequestHandler 5 | def initialize(session) 6 | @session = session 7 | end 8 | 9 | def process 10 | while @session.gets.chop.length != 0 11 | end 12 | @session.puts "HTTP/1.1 200 OK" 13 | @session.puts "content-type: text/html" 14 | @session.puts "" # End of headers 15 | @session.puts "" 16 | @session.puts " " 17 | @session.puts "
" 18 | @session.puts " #{Time.now}" 19 | @session.puts "
" 20 | @session.puts " " 21 | @session.puts "" 22 | @session.close 23 | end 24 | end 25 | 26 | server = TCPServer.new("0.0.0.0", "8888") 27 | $currentRequests = [] 28 | $requestedToShutDown = false 29 | 30 | while !$requestedToShutDown 31 | session = server.accept 32 | thread = Thread.new(session) do |newSession| 33 | RequestHandler.new(newSession).process 34 | end 35 | p thread.object_id 36 | $currentRequests.push(thread) 37 | end 38 | $currentRequests.each { |t| Thread.join(t) } 39 | -------------------------------------------------------------------------------- /source/OS/mutex.rb: -------------------------------------------------------------------------------- 1 | # encoding:utf-8 2 | 3 | require "thread" 4 | 5 | puts "Synchronize Thread" 6 | 7 | @num=200 8 | @mutex=Mutex.new 9 | 10 | def buyTicket(num) 11 | # 12 | # 受@mutex保护的临界区 13 | # @mutex.lock 14 | # if @num>=num 15 | # @num=@num-num 16 | # puts "you have successfully bought #{num} tickets" 17 | # else 18 | # puts "sorry,no enough tickets" 19 | # end 20 | # @mutex.unlock 21 | # 22 | 23 | # 与以上注释代码相同写法 24 | @mutex.synchronize do 25 | if @num>=num 26 | @num=@num-num 27 | puts "you have successfully bought #{num} tickets" 28 | else 29 | puts "sorry,no enough tickets" 30 | end 31 | end 32 | end 33 | 34 | ticket1=Thread.new 10 do 35 | 10.times do |value| 36 | ticketNum=15 37 | buyTicket(ticketNum) 38 | sleep 0.01 39 | end 40 | end 41 | 42 | ticket2=Thread.new 10 do 43 | 10.times do |value| 44 | ticketNum=20 45 | buyTicket(ticketNum) 46 | sleep 0.01 47 | end 48 | end 49 | 50 | sleep 1 51 | ticket1.join 52 | ticket2.join 53 | -------------------------------------------------------------------------------- /source/OS/queue.rb: -------------------------------------------------------------------------------- 1 | # encoding: utf-8 2 | require "thread" 3 | 4 | puts "SizedQuee Test" 5 | 6 | queue = Queue.new 7 | 8 | producer = Thread.new do 9 | 10.times do |i| 10 | sleep rand(i) # 让线程睡眠一段时间 11 | queue.enq i 12 | puts "#{i} produced" 13 | end 14 | end 15 | 16 | consumer = Thread.new do 17 | 10.times do |i| 18 | # 当queue为空时,consumer阻塞,直到queue有值,才被唤醒 19 | value = queue.deq 20 | sleep rand(i/2) 21 | puts "consumed #{value}" 22 | end 23 | end 24 | 25 | consumer.join 26 | -------------------------------------------------------------------------------- /source/Ruby面试题/CelsiusToFahrenheit.rb: -------------------------------------------------------------------------------- 1 | puts "Please select " 2 | puts 'A for Celsius to Fahrenheit' 3 | puts 'B for Fahrenheit to Celsius' 4 | STDOUT.flush 5 | string0 = gets.chomp 6 | if string0.downcase == 'a' 7 | puts 'Enter the temperature in Celsuis' 8 | STDOUT.flush 9 | string1 = gets.chomp 10 | x = string1.to_f 11 | y = 32+(9.0/5)*x 12 | puts 'The temperature in Fahrenheit is '+y.to_s 13 | else 14 | if string0.downcase == 'b' 15 | puts 'Enter the temperature in Fahrenheit' 16 | STDOUT.flush 17 | string2 = gets.chomp 18 | x = string2.to_f 19 | y = (x-32)*(5.0/9) 20 | puts 'The temperature in Celsius is '+y.to_s 21 | else 22 | puts 'Invalid option.' 23 | end 24 | end 25 | -------------------------------------------------------------------------------- /source/Ruby面试题/方法访问权限.rb: -------------------------------------------------------------------------------- 1 | =begin 2 | 在Ruby里,要读取,或是改变对象的属性,唯一的途径是调用对象的方法。 3 | 控制了对方法的访问,也就控制了对对象属性的访问。 4 | 控制对方法的访问,有三种方式: 5 | 访问控制 意义 6 | public 可以被任何实例对象调用,不存在访问控制; 7 | protected 可以被定义它的类和其子类访问,可以在类中或子类中指定给实例对象; 8 | private 可以被定义它的类和其子类访问,不能被实例对象调用。 9 | 方法默认都是公有的(initialize方法除外,它永远是私有的)。 10 | =end 11 | 12 | class Person 13 | def talk 14 | puts "public :talk,将调用speak" 15 | speak 16 | end 17 | 18 | protected 19 | def speak 20 | laugh 21 | end 22 | 23 | private 24 | def laugh 25 | puts "private:laugh" 26 | end 27 | end 28 | p1=Person.new 29 | p1.talk 30 | 31 | #p1.speak 实例对象不能访问protected方法 32 | #p1.laugh 实例对象不能访问private方法 33 | 34 | puts "-----------------------------------------------------" 35 | 36 | class Person 37 | protected 38 | def speak 39 | "protected:speak" 40 | end 41 | private 42 | def laugh 43 | "private:laugh" 44 | end 45 | end 46 | 47 | class Student < Person 48 | def useLaugh 49 | puts laugh 50 | end 51 | def useSpeak 52 | puts speak 53 | end 54 | end 55 | 56 | p2=Student.new 57 | p2.useLaugh # => private:laugh 58 | p2.useSpeak # => protected:speak 59 | 60 | puts "----------------------------------------------------" 61 | 62 | class Person 63 | protected 64 | def speak 65 | "protected:speak " 66 | end 67 | 68 | private 69 | def laugh 70 | "private:laugh" 71 | end 72 | 73 | def useLaugh(another) 74 | puts another.laugh #这里错误,私有方法不能指定对象 75 | end 76 | 77 | def useSpeak(another) 78 | puts another.speak 79 | end 80 | end 81 | p1=Person.new 82 | p2=Person.new 83 | p2.useSpeak(p1) # => protected:speak 84 | 85 | #p2.useLaugh(p1) 86 | 87 | =begin 88 | 从上面三个程序可以得出结论: 89 | public方法,可以被定义它的类和其子类访问,可以被类和子类的实例对 90 | 象调用; 91 | protected方法,可以被定义它的类和其子类访问,不能被类和子类的实例 92 | 对象直接调用,但是可以在类和子类中指定给实例对象; 93 | private方法, 94 | 可以被定义它的类和其子类访问,私有方法不能指定对象。 95 | =end 96 | -------------------------------------------------------------------------------- /source/数据结构与算法复习/binary_search.rb: -------------------------------------------------------------------------------- 1 | # 有序列表,元素按*升序*排列(递归实现) 2 | # params array 被查找的数列 3 | # params key 需要查找的元素 4 | # return 索引 5 | # 被查找的数列或者被分割后数列的开始位置 6 | # 被查找的数列或者被分割后数列的结束位置 7 | def binary_search(array, key, low=0, high=array.size-1) 8 | # 没有找到该元素则返回-1 9 | return -1 if low > high 10 | 11 | # 找到数组中间元素索引 12 | mid = (low + high) / 2 13 | 14 | # 找到该元素并返回该元素在数组中的索引 15 | return mid if array[mid] == key 16 | 17 | # 如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表 18 | if array[mid] > key 19 | high = mid - 1 20 | else 21 | low = mid + 1 22 | end 23 | binary_search(array, key, low, high) 24 | end 25 | 26 | ary = [1,2,3,4,5,6,7,8,9] 27 | puts binary_search(ary, 8) 28 | 29 | # 采用循环的实现 30 | def cycle_binary_search(array, key) 31 | low = 0 32 | high = array.size - 1 33 | 34 | while low > high 35 | mid = (low + high) / 2 36 | return mid if array[mid] == key 37 | 38 | if array[mid] > key 39 | high = mid - 1 40 | else 41 | low = mid + 1 42 | end 43 | end 44 | 45 | # 没有找到该元素 46 | return -1 47 | end 48 | 49 | ary = [1,2,3,4,5,6,7,8,9] 50 | puts binary_search(ary, 8) 51 | 52 | # 降序列表不适合以上算法 53 | # ary = [1,2,3,4,5,6,7,8,9].reverse 54 | # puts binary_search(ary, 8) #=> -1 55 | -------------------------------------------------------------------------------- /source/数据结构与算法复习/yanghuisanjiao.rb: -------------------------------------------------------------------------------- 1 | # 递归思想每一行我看做是一个数组,传入的参数是上一个数组 2 | # 当然每一个结果数组用temp缓存一下,每传入一个数组,那么打印一次,也就是每行的结果 3 | class Sanjiao 4 | def initialize row 5 | @row = row 6 | end 7 | 8 | def sanjiaoxing(temp) 9 | # 打印出本行元素 10 | temp.each{ |t| print t.to_s + ' '} 11 | array = Array.new(temp.length + 1) 12 | array_max_index = array.length - 1 13 | 14 | # 组建下一行,即下一行数组array 15 | 0.upto(array_max_index).each do |a| 16 | # 两端的就不用求 17 | if a == 0 || a == array_max_index 18 | array[a] = 1 19 | else 20 | # 根据上一个数组的结果得下一数组的值 21 | # to_i确保前一个数为nil时转换为0 22 | array[a] = temp[a-1].to_i + temp[a].to_i 23 | end 24 | end 25 | 26 | puts '' 27 | sanjiaoxing(array) if array.length < @row 28 | end 29 | end 30 | 31 | # 初始化temp的长度为1 32 | a = Array.new(1) 33 | a[0] = 1 34 | s = Sanjiao.new(20) 35 | s.sanjiaoxing(a) 36 | -------------------------------------------------------------------------------- /名人故事.md: -------------------------------------------------------------------------------- 1 | ### 名人故事 2 | * [“微信之父”张小龙 华中科大走出的“独孤大侠”](http://home.itchaguan.com/thread-33190-1-1.html) -------------------------------------------------------------------------------- /唱吧面试.md: -------------------------------------------------------------------------------- 1 | # 说说 Ruby的优势和劣势? 2 | 3 | # 说说NodeJs 网络通信用的是什么模块? 4 | 5 | # 说说 Apache负载均衡如何配置? 6 | 7 | # 唱吧我的主页里面有个最近访客,正对这个最近访客,你如何对数据库设计? 8 | 9 | # 高并发的网站的解决方案: 10 | * 高性能的服务器,数据库,程序语言,web容器 11 | 1. HTMl 静态化,有变化,就更新 12 | 2. 图片等多媒体服务起分离 13 | 3. 数据库采取集群,库表散猎 14 | 4. 缓存 15 | 5. 镜像(解决不同网络或地域之间带来的问题) 16 | 6. 负责均衡(软硬件的四层交互) 17 | 7. CDN 18 | 19 | ### 几种进程间的通信方式 20 | * 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。 21 | * 有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。 22 | * 信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。 23 | * 消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。 24 | * 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。 25 | * 共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。 26 | * 套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。 27 | 28 | ### 进程和线程的区别 29 | 简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 30 | 线程的划分尺度小于进程,使得多线程程序的并发性高。 31 | 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。 32 | 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 33 | 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别 34 | 35 | # 感悟 36 | 37 | * 对软件过早的优化,是万恶之源 38 | * 软件中唯一不变的就是变化 39 | * 架构师的技能: 40 | * 架构有大有小,不是处处需要,像建房子 41 | * 基本的一些,面向对象理论(设计模式,UML理论,架构模式,重构,代码质量的理论等) 42 | 43 | -------------------------------------------------------------------------------- /团队方面的问题.md: -------------------------------------------------------------------------------- 1 | ### 问:什么现在这个团队都找工作了? 2 | **主要表达:** 3 | * 自己离开这个团队出来,不是自己不负责任,正是由于对团队有很大的责任心,让每个人都发挥很好,所以才出来 4 | * (最重要)贵公司是一个非常不错的公司,表示赞许,愿意把自己的所学为公司创造价值,同时公司也让自己成长,达到双赢 5 | * 也有提升个人能力、见识、素养,走出学校,学得更多更广,为公司创造更大的价值,... 6 | 7 | ### 问:在团队方面做的最得意的事情,最得意的经验? 8 | **主要表达:** 9 | * ??? 10 | -------------------------------------------------------------------------------- /常用Rails命令收集.md: -------------------------------------------------------------------------------- 1 | ### rails gem factory_girl 2 | * rails g factory_girl:model post name,content,title -------------------------------------------------------------------------------- /常用gem.md: -------------------------------------------------------------------------------- 1 | ## 今天面试,问到一个问题: 你常用的哪些Gem,或者你觉得比较优秀的Gem,说两个呢? 2 | 3 | 两个月没有编程了,以前还是用过那么多的gem, 他突然喊我说,一下子什么都想不起来了!所以这里还是整理一下: 4 | 5 | 6 | ### 前端 7 | 8 | * slim 9 | * erb 10 | * coffeescript 11 | * less 12 | * bootstrap 13 | * highcharts-rails 14 | * simple_form 15 | 16 | ### 后端 17 | 18 | * devise 19 | * OmniAuth 20 | * will_paginate 21 | * Paperclip 22 | * Sunspot, thinking-sphinx # 全文搜索 23 | * Settingslogic 和 RailsSettings 24 | * CanCan 25 | * Nokogiri 26 | * Whenever 27 | * Cells 28 | * Grape 29 | * rolify 30 | * pry 31 | * Faraday # HTTP Client 支持多种方式 32 | * god # Ruby 进程监控工具 33 | * cucumber 34 | * rspec 35 | * turbolinks 36 | * ckeditor 37 | * rails_admin 38 | * mini_magick 39 | * scoped_search 40 | * acts-as-taggable-on 41 | * ruby-pinyin 42 | * factory_girl_rails 43 | * debugger 44 | * capistrano 45 | * sidekiq 46 | * doorkeeper 47 | * rails-api 48 | * rabl 49 | * jbuilder 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /敏捷开发.md: -------------------------------------------------------------------------------- 1 | ### 结对编程要注意什么? 2 | 3 | * 透露一个秘密,如果在结对过程中,候选人能够展现出他对快捷键和命令行的熟练,会在面试官心目中有加分的。 4 | * 了解了候选人过往的经历之后,他会主动挑一个自己最想讲的项目 5 | * 结对编程所选的项目多半都来自于之前做的功课,或者家庭作业,所以再此之前一定要自己好好的属性你自己的代码 6 | * HR提问时,尤其是一些和自己经历相关的经历,一定要主动展开,不要HR问一句回答一句。比如这次HR问到我大二写的那个类RAR的文件压缩器,我只是简单的说了一下是用MFC写的文件压缩器,而没有展开说 7 | * 面试题就是问他们团队实际工作中用到的技术,看看熟练程度多少,如果不熟悉愿不愿意学习. 8 | 9 | ### 敏捷之路 10 | * 结对编程 11 | * 测试先行 12 | * 小步快走 13 | * 每45分钟休息一次 14 | * [敏捷软件开发宣言](http://agilemanifesto.org/iso/zhchs/) 15 | * [敏捷宣言遵循的原则](http://agilemanifesto.org/iso/zhchs/principles.html) 16 | * 关于敏捷开发的26个心得: [26个心得](http://web.itivy.com/article-837-1.html) 17 | -------------------------------------------------------------------------------- /数据结构与算法复习.md: -------------------------------------------------------------------------------- 1 | **[有趣的学习网站-EN](http://www.cs.usfca.edu/~galles/visualization/Algorithms.html)** 2 | * **二分查找算法** 3 | 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好; 4 | 其缺点是要求待查表为有序表,且插入删除困难。 5 | 因此,折半查找方法适用于不经常变动而查找频繁的有序列表 。 6 | 首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功; 7 | 否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。 8 | 重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功 9 | 10 | 源代码: 数据结构与算法复习/binary_search.rb 11 | 12 | * **杨辉三角** 13 | 前提:端点的数为1. 14 | * 每个数等于它上方两数之和。 15 | * 每行数字左右对称,由1开始逐渐变大。 16 | * 第n行的数字有n项。 17 | * 第n行数字和为2^(n-1)。 18 | 19 | 源代码:数据结构与算法复习/yanghuisanjiao.rb 20 | 21 | * [顺序表,链表,栈,队列](http://developer.51cto.com/art/201204/332798.htm) 22 | * 树 23 | * 图 24 | * [排序](http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html) 25 | 26 | * 快速排序 <基准> 27 | * 插入排序 当插入第i个元素时,前面的i-1个元素已经排列好,用Vi依次去比较前面的i-1个元素,找到合适的位置插入 28 | * 选择排序 直接从待排序数组里选择一个最小(或最大)的数字,每次都拿一个最小数字出来,顺序放入新数组,直到全部拿完 29 | * 归并排序(Merge sort) 把原始数组分成若干子数组,对每一个子数组进行排序,继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 30 | * 基数排序 <排序码> 31 | * 桶排序(Bucket sort) 无序数组有个要求,就是成员隶属于固定(有限的)的区间, 32 | * 冒泡排序(交换排序) <内循环><外循环> 临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换 33 | * 希尔排序(Shell sort) ?? 34 | * 搜索 35 | -------------------------------------------------------------------------------- /杭州阿里巴巴电话面.md: -------------------------------------------------------------------------------- 1 | # 很庆幸,今天做了阿里巴巴的电话面试了,面试我的是现在华顺哥手下的一员大将,以后就是负责他们现在的那个快盘开发, 2 | 3 | 正对我的简历,做了一下面试 4 | 5 | ### 你学过PHP是吧, 那我问你一下,PHP中输出调试信息是用的什么方法? 6 | 7 | ### 我看你用过thrift, 你给讲讲thrift的工作原理吧? 8 | * 他主要解决一些什么问题? 9 | * 他的使用场景是什么? 10 | * 在什么样的框架下,可以使用他? 11 | * 我在移动端,或者js可以使用他吗? 12 | 13 | ### 比较一下Node和Ruby 14 | * 他们性能谁好? 在高压,并发上,谁好? 说说为什么会这样? 15 | * 你知道QPS吗? 16 | * 或者你比较一下Node和ROR? 17 | 18 | ### 讲讲你之前做的推荐算法 19 | 20 | ### 你的密码管理中密码在数据库中是如何放的? 用的什么加密呢? 21 | 22 | ### 说说你的产品Mine的功能和实现方式 23 | 24 | ### 说说ajax中的asy那个同步参数的作用?false,true,分别表示什么? 25 | 26 | ### 你给我讲讲Js中冒泡的原理 27 | * 外围和内部都有绑定事件,当外围点击后,是先激发哪一个事件呢? 28 | 29 | ### 16精制数OxFF,转换成10精制,你的算的思路是? 30 | 31 | ### 一个类的父类和他引进的模块中都有同一个方法,现在要调用这个方法,他会先调用哪一个? 32 | * 从他的祖先联中是如何去找的? 33 | 34 | ### 在mac上的Retinal屏显示图片,我们会做哪些除了?(图片要处理,CSS也要通过响应时去处理) 35 | 36 | ### ActiveRecord中,比如我有一个User的Model,他里面有一个类方法method_a,现在我的链式调用, User.where(....).method_a,这样是可行的吗? 37 | * 为什么? 38 | 39 | ### 最后的面试结果: 40 | 41 | 五五开,评论是: 我知道的面很广,但是很多原理性的东西还不是很清晰,注重运用,但是偏离原理,还需要进一步面试 42 | 43 | ### 写在最后 44 | 45 | 做任何事情,学任何技术,都要问个为什么,这样我们深究其理,才好学的更透! 46 | -------------------------------------------------------------------------------- /活跃网络(ActiveNetwork)面试.md: -------------------------------------------------------------------------------- 1 | ** 说明 ** 2 | 3 | 此文为西安活跃网络技术电话面试相关问题 4 | 5 | ### 说说你理解的OOP? 6 | * 面向对象可以理解成对待每一个问题,都是首先要确定这个问题由几个部分组成,而每一个部分其实就是一个对象。然后再分别设计这些对象,最后得到整个程序。传统的程序设计多是基于功能的思想来进行考虑和设计的,而面向对象的程序设计则是基于对象的角度来考虑问题。这样做能够使得程序更加简洁、清晰。 7 | 8 | 理解面向对象的编程的思想,首先我想给大家一个非常熟悉的一个例子,让大家对面向对象和面向过程有一个大致的理解,想必大家都知道那个“老张开车去东北”的例子,用面向过程的思路理解:你首先得造一个车,然后包括挂档,每一步都得自己一步一步的线性去完成;用面向对象的思路来理解的话,直接调个车,找个司机,然后告诉他去东北,然后其他的就不用你管了,你可能隐约的感觉到,面向对象的思路似乎省了不少事。 9 | 10 | * 面向对象的三大特征是什么? 11 | * 封装: 是指一个对象将自己的数据和操作合理的有效的封装在一起 12 | * 继成:子类可以遗传父类的操作和数据,且自己也能有自己的操作和数据 13 | * 多态: 有两种意义上的多态,一种操作名称上的,即,具有多个名称相同的操作,但是他们接受的消息类型不一样,另一种:和继承有关,同一个操作被不同的类继承覆盖 14 | * 参考图: 15 | * [!图片](http://images.51cto.com/files/uploadimg/20100331/114910755.jpg) 16 | 17 | ### 拓展问题:面向过程和面向对象有什么区别? 18 | 19 | 面向过程就是指分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。 20 | 21 | 面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题步骤中的行为。 22 | 23 | 面向对象面向的是数据结构,面向过程面向的是算法。虽然面向对象在数据构造方面优于面向过程,但是面向过程是算法设计的实现基础,面向对象的程序设计最终还要转化为面向过程。 24 | 25 | ### 鸭子类型怎么实现的? 26 | * 在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的,在被调用的对象中不管你是什么类型,你只有有这个方法就行。 27 | 28 | 29 | ### include和extende的区别? 30 | * include 包涵,聚合,组合的关系,可以多个, include后是类的实例方法 31 | * extende 继承关系,只能一个,extend是变成类方法 32 | * 模块不能实例化,类不能include 33 | 34 | ### 分析过Ruby、Rails 源码? Ruby的底层实现? 35 | 36 | 37 | ### Rails的启动流程? 内部底层架构? 38 | * 比如我们每次使用rails c, rails s等,相关命令后的流程,深入理解? 39 | 40 | ### Rails本身自带了哪些缓存?有哪些缓存方法? 41 | * key <-> value ,key在Rails中是什么?, id 和 updated_at 42 | 43 | ### Rails 自带缓存有哪些? 44 | * 页面缓存 45 | * 动作缓存 46 | * 片段缓存 47 | * 底层缓存 48 | * SQL 缓存 49 | * http://guides.ruby-china.org/caching_with_rails.html#activesupport::cache::memcachestore 50 | * http://rails-everyday.group.iteye.com/group/wiki/1160 51 | 52 | 53 | 54 | 55 | ### Rails中只读一个字段,或者累加某一个field的关键字是什么? 56 | 57 | ### 符合和字符串的区别是什么? 58 | * 字符串和符号,都是Ruby中表示文本的方式 59 | * 相同的符号是一个对象,相同的字符并不一定是一个对象 60 | * 处理符号相比字符串,占用更少的资源 61 | * 由于字符串变量必须具有各种修改其内容的功能,所以字符串的维护和处理的开销就很大 62 | 63 | ### 网页优化,从前端到后端有哪些方式? 64 | * https://github.com/NoonTechnology/interview_summarize/blob/master/%E5%94%B1%E5%90%A7%E9%9D%A2%E8%AF%95.md 65 | 66 | ### 说我github上面的项目有些混杂 67 | 68 | ### 我有哪些特长在面试中没有被问道的? 69 | -------------------------------------------------------------------------------- /测试.md: -------------------------------------------------------------------------------- 1 | * TDD 2 | * 利用测试来驱动程序的设计及其实现 3 | * BDD 4 | * 倡导在编写测试的同时描述代码的行为 5 | * DDD 6 | -------------------------------------------------------------------------------- /用户体验.md: -------------------------------------------------------------------------------- 1 | ### 观点视角 2 | * [浅谈用户体验的“反面模式”](http://web.itivy.com/article-722-1.html) 3 | * [深入探讨扁平化设计](http://www.oschina.net/translate/flat-design-an-in-depth-look) 4 | * [16点优化用户界面的方法](http://www.uml.org.cn/jmshj/201307252.asp) 5 | * [如何准确看清用户需求?](http://www.uml.org.cn/jmshj/201305224.asp) 6 | * [让用户更高效地完成表单填写](http://www.uml.org.cn/jmshj/201307232.asp) 7 | * [Web页面中的“门”—Web端登录页的设计](http://www.uml.org.cn/jmshj/201306261.asp) 8 | * [提高表格可读性的一些技巧](http://www.uml.org.cn/jmshj/201306211.asp) 9 | * [用户体验的距离](http://www.uml.org.cn/jmshj/201212285.asp) 10 | * [关于更多的用户体验研究](http://www.uml.org.cn/jmshj/jmshj-yh.asp) 11 | * 为什么“朋友圈”不鼓励发文字? 12 | > 朋友圈”的发文字功能本是内部测试用的,虽然要长按相机键才能发文字,但即便如此隐晦,这个功能还是被用户发现了。 13 | “当时也想到了,肯定会有人发现,那我想如果被发现了,这也是一个很好的被口碑传播的彩蛋,因为别人发现了会很兴奋,然后会去炫耀、去告诉别人,那他也会传播开,但他传播不会特别广,不会导致里面文字泛滥了。” 张小龙说到 14 | “回过头来说,微信朋友圈原本是不允许发文字,或者说不鼓励发文字的。不光是怕泛滥,这里有个基本的假设,要一个人写一段字的难度远远大于他发一张图片,对于一个普通用户来说,你让他一天写一段话出来,而且这段话还得让别人看到,他还要写得好,其实很难。我希望我们的产品是每个人都能用的,那么,图片是最好的介质,图片每个人都会发。” 15 | 新浪微博很多人都不会用,而朋友圈的目的是要让每个人都能用,如果要完成这个目的,就一定要把门槛降到最低,降到哪怕一个农民工也会用,这种挑战难度其实是很高的。 16 | “如果是文字和图片都有的话,反而不容易达成这样的目标。比如说,你的文字写得好,你肯定会每天都写一些,你的朋友一看,你的水平那么高,我肯定不写了。又或者你看别人的文字那么诗情画意,你拍一个吃饭的画面,你都觉得不好意思了。” 17 | -------------------------------------------------------------------------------- /百度电话面试.md: -------------------------------------------------------------------------------- 1 | ### 好奇怪,百度的面试官是个女的!!!! 还很厉害的样子! 2 | 3 | # 在网上在找找 百度电话面试的其他题! 4 | 5 | 6 | ### 学过C++吗? 7 | 8 | ### 讲讲Ruby优缺点? 9 | * 介绍一下ruby 10 | 11 | Ruby是一种功能强大的面向对象的脚本语言,可以使用它方便快捷地进行面向对象程序设计。与Perl类似,而且Ruby具有强大的文本处理功能,使文本处理变得简单。此外还可以方便地使用C语言来扩展Ruby的功能。 12 | 若您曾经“想要一种简单的面向对象的语言”,或者认为“Perl的功能虽然好用,但它的语法真让人受不了”,又或者觉得“LISP系列语言的思想不错,但到处都是括号真让人讨厌,最起码算式应该按照通常的样式书写”。那么,Ruby或许能让您满意。 13 | 14 | 归纳起来,Ruby有以下优点: 15 | 16 | 解释型执行,方便快捷 17 | 18 | Ruby是解释型语言,其程序无需编译即可执行。 19 | 20 | 语法简单、优雅 21 | 22 | 语法比较简单,类似Algol系语法。 23 | 24 | 完全面向对象 25 | 26 | Ruby从一开始就被设计成纯粹的面向对象语言,因此所有东西都是对象,例如整数等基本数据类型。 27 | 28 | 内置正则式引擎,适合文本处理 29 | 30 | Ruby支持功能强大的字符串操作和正则表达式检索功能,可以方便的对字符串进行处理。 31 | 32 | 自动垃圾收集 33 | 34 | 具有垃圾回收(Garbage Collect,GC)功能,能自动回收不再使用的对象。不需要用户对内存进行管理。 35 | 36 | 跨平台和高度可移植性 37 | 38 | Ruby支持多种平台,在Windows, Unix, Linux, 39 | 40 | MacOS上都可以运行。Ruby程序的可移植性非常好,绝大多数程序可以不加修改的在各种平台上加以运行。 41 | 42 | 有优雅、完善的异常处理机制 43 | 44 | Ruby提供了一整套异常处理机制,可以方便优雅地处理代码处理出错的情况。 45 | 46 | 拥有很多高级特性 47 | 48 | Ruby拥有很多高级特性,例如操作符重载、Mix-ins、特殊方法等等,是用这些特性可以方便地完成各种强大的功能。 49 | 50 | 同时,由于是解释型语言,Ruby也有下列缺点: 51 | 52 | 解释型语言,所以速度较慢 53 | 54 | 静态检查比较少 55 | 56 | 57 | 58 | * 说说他的线程机制? 59 | 60 | ### 讲讲Ruby的单例类,和单例方法 61 | 62 | ### 讲讲Ruby的垃圾回收机制 63 | 64 | ### hadloop,Mapreduce 相关的: 如果我有一个很大的日志文件,但是有很小的内存,我如何设计程序去分析这些文件?(切片) 65 | 66 | ### 用shell,Linux吗?: 如果我要杀掉系统中10个PHP进程,你的shell是什么?(top命令很不好) 67 | 68 | ### 你有哪些方式去解决Mysql的性能问题? 69 | 70 | * 有哪些方式? 71 | * 切片后如果我有256张表,现在要扩展一张,我如何做? 72 | 73 | ### 对比一下Mongodb和Mysql, 他们分别的使用场景是什么? 74 | 75 | ### Mysql和Mongodb的索引实现机制是什么? 76 | 77 | # 数据结构篇 78 | 79 | ### 什么是平衡二叉树? 80 | 81 | ### 二叉树的遍历方式? 82 | 83 | ### 二叉树的深度和广度? 84 | 85 | ### 如何判断链表是否带环? 86 | 87 | 1、如何判断是否存在环? 88 | 2、如何知道环的长度? 89 | 3、如何找出环的连接点在哪里? 90 | 4、带环链表的长度是多少? 91 | 92 | 解法: 93 | 1、对于问题1,使用追赶的方法,设定两个指针slow、fast,从头指针开始,每次分别前进1步、2步。如存在环,则两者相遇;如不存在环,fast遇到NULL退出。 94 | 2、对于问题2,记录下问题1的碰撞点p,slow、fast从该点开始,再次碰撞所走过的操作数就是环的长度s。 95 | 3、问题3:有定理:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接点。(证明在后面附注) 96 | 4、问题3中已经求出连接点距离头指针的长度,加上问题2中求出的环的长度,二者之和就是带环单链表的长度 97 | http://blog.sina.com.cn/s/blog_725dd1010100tqwp.html 98 | 99 | # 设计模式 100 | 101 | ### 你都用过哪些设计模式? 102 | 103 | ### 讲讲单例模式,并说说,他有哪些缺憾? 104 | 105 | # 编程题 106 | 107 | 写一段程序,验证括号是否按照正确的方式在匹配? 用到的数据结构叫什么名字? 108 | 109 | # 测试题 110 | 111 | ### 如果喊你测试一支笔,你会从哪些方面去测试? 112 | 113 | ### 在功能测试中,如果对某一功能,如:有墨水能画出来,做测试,你会从哪些方面去考虑,他的边界测试又是哪些? 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | -------------------------------------------------------------------------------- /面试常见问题.md: -------------------------------------------------------------------------------- 1 | * 了解面试公司的背景和产品,最好能对他们的产品提出建议 2 | * 看过哪些的书籍,包括技术和非技术的 3 | -------------------------------------------------------------------------------- /项目,产品面试(非技术).md: -------------------------------------------------------------------------------- 1 | ** 写在前面 ** 见面要握手,顺便一句: 怎么称呼? 2 | 3 | ### 你先自我介绍一下吧 4 | 5 | * 最好以一种幽默或者自嘲的方式讲出自己的名字(本人) 6 | * 我一直在互联网行业摸爬滚打多年,突出自己的能力,经验 7 | * 我主要从事....技术(突出介绍) 8 | 9 | **例如** 10 | 11 | 您好,XXX, 本人,性李,名江华,江华二字取于,长江之江字,中华之华字,当时父母也是希望寄托名字的宏伟时时预示和提醒 12 | 自己定筹划一个不平凡的人生。 13 | 14 | 我兴趣爱好广,喜欢思考和总结,一直在互联网行业摸爬滚打了多年,积累了较多的经验,参与过各种各样的项目 15 | 16 | 我技术范围虽随涉有一定的面,但是现在主要从事Ruby、Rails相关的研发,平时都是给自己的一个全站工程师的角色定位,这次很高兴能来参加XXX 17 | 的面试,同时也是希望有机会,能为我们工作做出我的一些努力。 18 | 19 | 20 | ### 你现在是只做或者只喜欢Ruby相关的开发吗? 21 | 22 | * 首先答案肯定是否定的! 23 | * 我是怎么定位Ruby这个语言?又是怎么样看待其他语言? 24 | * 我是怎么和Ruby结缘? 25 | * 我为什莫现在停于Ruby? 26 | 27 | ### 你说说Ruby这个语言好在哪里? 他的优缺点是什么? 他的哪些特性适合在我们项目的使用? 28 | 29 | * 我自认为Ruby其实就好像编程语言届的MAC,小而精,Java就如同Windows,大而广。 30 | * 优点:我在使用他的过程中,感触最大的几点吧: 31 | * 表现:代码,简洁漂亮,不像JAva的繁重的一串 32 | * 功能: 动态 33 | * 还有其他的一些有点,比如,.....想这样的小而精的有点就不一一的举例了 34 | * 缺点:很多人说Ruby,这样,或者那样的不好,其实我通过我参加过的大小项目,觉得都还好啦,说一个我在项目中用到的确定吧 35 | * 36 | * Ruby的为什莫适合我们的项目?或者Ruby适合哪些项目? 37 | * ....线程限制,绿色线程 38 | * 编译性语言,慢 39 | 40 | ### 你也做过这么多的项目,你说说在你之前的一些项目中遇到过哪些困难,又是怎么解决的呢? 41 | 42 | * 每一个项目其实从开始到结束都会发生很多有趣的事情,开心的,不开心的,技术上的,团队上的,管理上的,都有,其实总体来说 43 | ,我之前的一些项目都还很好啦,我就分享一个技术上的,和一个团队上的事情吧 44 | * 技术: 技术实现不了(请外援) 45 | * 团队上的: 协调问题,价值观的问题,沟通问题 46 | * 管理上: 文档,进度等,因为大家的职责可能是举证行的 47 | 48 | ### 你曾经遇到过的一些技术难点,分享一个? 49 | * ... Mapreduce 50 | 51 | ### 你通常都会怎么样去管理一个项目? 52 | * .. 9大项目管理内容 53 | * 多块好省,范围管理,时间管理,质量管理,成本管理 54 | * 沟通,资源,采购管理 55 | * 风险管理 56 | * 整合管理 57 | 58 | ### 你评价一下你自己对行业的认识,行业发展方向,和自己的规划? 59 | 60 | ### 你了解唱吧嘛? 说说你对唱吧的认识 61 | * 分为 62 | * 技术: 图片问题?,哪些可以优化?,你们后台的架构是?Ruby会如何解决? 63 | * 产品: Ui? 64 | * 团队? 65 | * 社交内产品? 66 | * 我为什么对唱吧感兴趣? 67 | 68 | ### 项目经理和产品经理的区别? 69 | * 项目经理: 监制,老师,督战,技术,架构 70 | * 拿到需求,进度管理.... 71 | * 传统公司:项目经理为老大 72 | * 产品公司: 产品经理老大 73 | * 产品经理: 妈妈,对外 74 | * 两个平庸的人在一起怎么做? 75 | 76 | ### 举一个列子,你是怎么从头到位的管理研发一个项目的? 77 | * 自己拿到需求,或者是一个产品,首先要自己弄清楚,需求,技术,市场,,自己要知道这个是干什么的! 78 | * 其次,要明确需要一个什么样的团队,与相关的干系人沟通 79 | * 项目启动会.. 80 | * 制定项目计划,执行 81 | * 项目过程管理 82 | * 时间,里程碑,wbs, 83 | * 周报,月报,每天的跟进、对外 84 | * 项目收尾,功过奖励 85 | 86 | ### 如何保障一个项目的完成? 87 | * 第一 时间上 88 | * 第二 资金上 89 | * 第三 90 | 91 | 92 | ### 我如何给自己定位的,技术,项目管理? 93 | * 其实我都很喜欢,但更倾向于项目管理,但是我给我自己的定位是必须是技术切人。 94 | 95 | ### 我最近的职业规划? 96 | * 5年,10年 97 | * 最近,,在贵公司实现自己最大的价值 98 | 99 | ### 为什么离开上一个工作? 100 | 101 | ### 简历的图有问题 102 | 103 | ### 相关管理过程中如果遇到年长的,不听话的,你怎么处理? 104 | * 私下沟通,先做朋友,送送吃的,把问题放给他,让他先提意见 105 | * 第一次,嘘寒问暖,是不是遇到什么麻烦,需要我们提供什么支持? 106 | * 第二次,提醒,加油 107 | * 第三次,调换任务 108 | * 第四次,人员的调配(这点谨慎使用) 109 | 110 | 111 | ### 说说自己的优缺点 112 | * 优点: 爱学习,唉吃苦,爱研究 113 | * 利他之心,不够 114 | 115 | ### 如何管理团队? 116 | * 生活上 117 | * 项目活动, 私底下沟通 118 | * 具有人文气息,人性话的氛围 119 | * 观察士气,即使分析,和解 120 | * 技术上 121 | * 定期的技术分享, 122 | * 建立相应的规章制度 123 | * ... 124 | 125 | ### 什么是项目经理? 126 | 127 | ### 谈谈你对架构的认识? 128 | 129 | 架构依项目需求而定 130 | * 系统架构 131 | * 什么数量级的, 132 | * 什么情况下的用什么架构 133 | * 接口的规范 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | --------------------------------------------------------------------------------