Minimal and Clean blog theme for Hugo

Java执行shell命令


添加依赖

首先使用Spring Boot开启一个RESTful项目,额外的加上Apache Commons Exec的依赖。

Exec官网1API文档

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-exec</artifactId>
    <version>1.3</version>
</dependency>

代码实现

这里分两种情况。一个是最简的只关心执行是否成功,也就是code大于0为失败;另一个是需要拿到执行的标准输出和错误的信息。

只关心是否成功

@Service
public class MainService {
    public Integer updateBlogFromGit(){
        // 1
        CommandLine pull = CommandLine.parse("git pull");

        // 2
        DefaultExecutor executor = new DefaultExecutor();
        executor.setWorkingDirectory(new File("/home/ubuntu/blog"));

        // 3,省略try_catch
        int exitValue = executor.execute(pull);
        if (exitValue == 0) {
            exitValue = executor.execute(hugo);
        }
        return exitValue;
    }
}
  1. 准备要运行的shell命令
  2. 创建执行器,并设置工作目录
  3. 最后执行命令,返回code

要拿到标准输出和错误的信息

@Service
public class MainService {
    public String updateBlogFromGit(){
        // 1
        CommandLine pull = CommandLine.parse("git pull");
        CommandLine hugo = CommandLine.parse("hugo");

        // 2
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        ByteArrayOutputStream errorStream = new ByteArrayOutputStream();
        PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream, errorStream);

        // 3
        DefaultExecutor executor = new DefaultExecutor();
        executor.setWorkingDirectory(new File("/home/ubuntu/blog"));
        executor.setStreamHandler(streamHandler);

        // 4
        try {
            int exitValue = executor.execute(pull);
            if (exitValue == 0) {
                exitValue = executor.execute(hugo);
            }
            String result;
            if(exitValue==0){
                result= outputStream.toString();
            } else {
                result = errorStream.toString();
            }
            return result;
        } catch (ExecuteException e) {
            return errorStream.toString();
        } catch (IOException e) {
            return e.getMessage();
        }
    }
}
  1. 准备要运行的shell命令
  2. 准备接收标准输出和错误的Stream
  3. 创建执行器,并设置工作目录,设置StreamHandler
  4. 最后执行命令(如果执行时出错会返回大于0的整数),返回标准输出或错误信息或报错堆栈信息

收获

技能树:

Read more ⟶

Spring探索与扫盲


刚刚接触Spring,感觉它是一个庞大的体系,内容很多。现在想要对它有一个总体的、感性的认识和了解。首先从官网入手。

spring.io官网下的第一个目录——projects,里面列举了Spring的项目。打开一个项目可以看到它的介绍,学习资料,文档,示例。

第二个目录是guides,里面包含很多的、各个方面的入门引导,这些入门引导都是很简单的。下面还有两个模块——Topical Guides和Tutorials,这两部分稍微长一点,比第一部分要详细一些、内容多一些。

第三个目录是一些付费的培训和认证。

Projects

Spring Framework,必学

这个应该是通常说到Spring时代表的Spring本人。

Spring框架可在任何类型的部署平台上为基于Java的现代企业应用程序提供全面的编程和配置模型。

Spring的一个关键元素是在应用程序级别的基础架构支持:Spring专注于企业应用程序的“管道”,以便团队可以专注于应用程序级别的业务逻辑,而不必与特定的部署环境建立不必要的联系。

Spring Data,要学

网址

它包含了所有数据存储的子项目,JDBC、JPA、MongoDB、Redis、REST,他们都被这个项目封装了,可以用一致的API使用。

Spring Data的任务是为数据访问提供一个熟悉且一致的,基于Spring的编程模型,同时仍保留基础数据存储的特​​殊特征。

它使使用数据访问技术,关系和非关系数据库,map-reduce框架以及基于云的数据服务变得容易。这是一个总括项目,其中包含许多特定于给定数据库的子项目。这些项目是通过与这些令人兴奋的技术背后的许多公司和开发人员共同开发的。

Spring Security,要学

这个应该是用来做登录、权限管理的。下面是机翻介绍和特性。

Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的实际标准。

Spring Security是一个框架,致力于为Java应用程序提供身份验证和授权。与所有Spring项目一样,Spring Security的真正强大之处在于可以轻松扩展以满足自定义要求

特性

  • 对身份验证和授权的全面且可扩展的支持
  • 防御会话固定,点击劫持,跨站点请求伪造等攻击
  • Servlet API集成
  • 与Spring Web MVC的可选集成

Spring REST Docs,可能要学

貌似是用来生成RESTful服务的文档的。

Spring REST Docs可帮助您记录RESTful服务。

它结合了用Asciidoctor编写的手写文档和Spring MVC Test生成的自动生成的代码片段。这种方法使您摆脱了Swagger之类的工具所产生的文档限制。

它可以帮助您生成准确,简洁且结构合理的文档。然后,该文档可让您的用户以最少的麻烦获得他们所需的信息。

Spring Cloud,要学

官方介绍的机翻如下,可以用来搭建微服务系统。

Spring Cloud为开发人员提供了工具,以快速构建分布式系统中的某些常见模式(例如,配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁,领导选举,分布式会话,群集状态)。分布式系统的协调导致样板式样,并且使用Spring Cloud开发人员可以快速站起来实现这些样板的服务和应用程序。它们可以在任何分布式环境中正常工作,包括开发人员自己的笔记本电脑,裸机数据中心以及Cloud Foundry等托管平台。

Spring AMQP,可能要学

消息队列服务

AMQP维基百科

高级消息队列协议即Advanced Message Queuing Protocol(AMQP)。高级消息队列协议是一种二进制应用层协议,用于应对广泛的面向消息应用程序的支持。协议提供了消息流控制,保证的一个消息对象的传递过程,如至多一次、保证多次、仅有一次等,和基于SASL和TLS的身份验证和消息加密.

是面向消息中间件提供的开放的应用层协议,其设计目标是对于消息的排序、路由(包括点对点和订阅-发布)、保持可靠性、保证安全性[1]。AMQP规范了消息传递方和接收方的行为,以使消息在不同的提供商之间实现互操作性,就像SMTP,HTTP,FTP等协议可以创建交互系统一样。与先前的中间件标准(如Java消息服务)不同的是,JMS在特定的API接口层面和实现行为上进行了统一,而高级消息队列协议则关注于各种消息如何以字节流的形式进行传递。因此,使用了符合协议实现的任意应用程序之间可以保持对消息的创建、传递。

Spring AMQP项目官方介绍的机翻

Spring AMQP项目将Spring的核心概念应用于基于AMQP的消息传递解决方案的开发。它提供了一个“模板”作为用于发送和接收消息的高级抽象。它还通过“侦听器容器”为消息驱动的POJO提供支持。这些库有助于AMQP资源的管理,同时促进对依赖项注入和声明性配置的使用。在所有这些情况下,您将看到与Spring Framework中的JMS支持相似的地方。

该项目包括两个部分;spring-amqp是基础抽象,spring-rabbit是RabbitMQ实现。

Spring Batch,可能要学

批处理框架,公司的什么业务需要批处理呢?日志?统计?比如搞一个服务分析nginx的access.log,看一下访问日志,哪些资源被访问的多?

Read more ⟶

未读


213

康奈尔笔记法

2019年11月25日12:26:15

上半右边为要点,左边为线索,下部为总结。看的过程中记录要点,看完了提炼线索。总结整个笔记,用自己的语言,最好与已经会的东西发生练习。

PostgreSQL与MySQL对比

知乎帖子

pg攻略

python控制手机

https://zhuanlan.zhihu.com/p/57349184

梯子攻略

https://github.com/haoel/haoel.github.io

JavaScript开发者应懂的33个概念

https://github.com/stephentian/33-js-concepts

如何写文档

https://www.divio.com/blog/documentation/

反向面试的问题

https://github.com/yifeikong/reverse-interview-zh

InnoDB架构

https://mp.weixin.qq.com/s/zKHNaWY5AS0OMmag1mQTKQ

uuid

https://zh.wikipedia.org/wiki/%E9%80%9A%E7%94%A8%E5%94%AF%E4%B8%80%E8%AF%86%E5%88%AB%E7%A0%81
https://github.com/kelektiv/node-uuid
https://www.zhihu.com/question/34876910

简书收藏:可靠web验证

aaa

TCP的简单介绍

https://robertovitillo.com/what-every-developer-should-know-about-tcp/

利用 Github Action 自动发布电子书

https://devops.novalagung.com/en/cicd-serverless-ebook-gitbook-github-pages-actions-calibre.html

Java实现的正则表达式引擎

https://github.com/xindoo/regex

使用 loT 改善睡眠

https://medium.com/memos-of-the-future/using-iot-to-optimize-your-sleep-c9747bd8633e

利用webRTC进行端到端的文件传输

https://webwormhole.io/

中文Github项目排名

https://github.com/kon9chunkit/GitHub-Chinese-Top-Charts

Git的奇技淫巧

https://github.com/521xueweihan/git-tips

中国程序员容易发音错误的单词

https://github.com/shimohq/chinese-programmer-wrong-pronunciation

程序员如何优雅的挣零花钱

https://github.com/easychen/howto-make-more-money

面试基础知识

算法、网络、系统设计等

https://github.com/CyC2018/CS-Notes

程序员技术

程序员基础

  1. 算法、数据结构 基础的常用的要掌握:链表、散列表、树,排序、查找
  2. 网络协议 基础的:http、websocket 高级的:TCP/IP

前端程序员基础

  1. 程序运行的环境——浏览器——的工作原理 基础的:event loop 、重绘重排、跨域、事件(代理、冒泡)
  2. 语言HTML、CSS 块级上下文、盒子模型、居中
  3. 语言JavaScript 基础:数据类型、对象函数、创建对象(设计模式)、继承(原型) 中级:模块化、立即执行函数、闭包、变量提升、作用域、箭头函数 高级:深拷贝、截流
  4. 语言ES6+ 箭头函数、代理、object、array、promise
  5. 语言TypeScript 枚举、泛型
  6. 框架React 生命周期

职业发展

  1. 自己的有点长处、需要改进加强的地方
  2. 职业规划 现在不管是正常的业务需求还是技术难题都能独立地搞定,属于【能做】。接下来是希望【做好】,就是提高效率和质量,比如自动化、规范、设计组件和模块。再往后就做一些传帮带的工作。
Read more ⟶

Redux Toolkit


Redux ToolkitRedux 官方提供的工具箱🧰,它指定了一个 Redux 的使用规则,集成了 immer thunk 等常用的工具库,还有很好的 typescript 支持。

slice

安装

yarn add @reduxjs/toolkit
// 或者
npx create-react-app my-app --template redux

初始化store

import { configureStore, createReducer } from 'redux-starter-kit';
export const add = createAction('add')
const initialState = { number: 0 }
const reducer = createReducer(initialState, {
  [add]: (state, action) => state.number = action.number,
})
const store = configureStore({reducer})
export default store;

调用

// ...
import { Provider } from 'react-redux'
import store from './store'

ReactDOM.render(
  <Provider store={store}><App />
  </Provider>, document.getElementById('root')
);
// ...
import { useSelector, useDispatch } from 'react-redux'
import { add } from './store'
function App() {
  const number = useSelector(state => state.number)
  const dispatch = useDispatch()
  return (
    <div className="App">
      <p>{number}</p>
      <button onClick={() => dispatch(add(number+1))}> + </button>
    </div>
  );
}

创建store

configureStore用于初始化redux仓库,可以合并reducer,可以方便的创建中间件等。

Read more ⟶

JavaScript语言精华


精华

我相信我精雕细琢出来的优雅子集大大地优于这门语言的整体,它更可靠、更易读、更易于维护。

浏览器API和DOM相当糟糕,连累了JavaScript。写一本DOM的精华的书是一项不可能完成的任务。

JavaScript中优秀的想法包括函数、弱类型、动态对象和富有变现力的对象字面量表示法。糟粕的想法包括基于全局变量的编程模型。

对象

JavaScript包含一种原型链的特性,允许对象继承另一个对象的属性。

原型

每个对象都连接到一个原型对象,并可以从中继承属性。对象字面量创建的对象都连接到Object.prototype,它是JavaScript中过的标配对象。

函数

函数对象

函数也是对象,对象字面量创建的对象连接到Object.prototype,函数对象连接到Function.prototype,而它又连接到Object.prototype

函数字面量

通过函数字面量创建的函数对象包含一个连到外部上下文的连接。这被称为闭包(closure)。

调用

除了声明时定义的形式参数,每个函数还接收两个附加的参数:this和arguments。

this的值取决于调用的模式。有4中调用模式:方法、函数、构造器、apply。

方法调用模式

函数被作为一个对象的属性,就教方法。此时this为该对象。

函数调用模式

函数没有作为对象的属性,他就被当作一个函数调用了。此模式this被绑定到全局变量。

如果在一个方法内,又定义了一个函数,而这个函数中使用了this,那么这个this就是指向的全局变量。这是一个语言设计错误,正确的设计应该是指向方法中的this。有一个容易的解决方案:将方法中的一个变量赋值为this,函数中访问变量即可。

myObject.double = function(){
  var that = this;
  var helper = function(){
    that.value = add(that.value, that.value)
  }
  helper();
}

helper 函数中如果使用 this 这个 this 就是指向全局变量。

构造器调用模式

JavaScript是一门基于原型继承的语言,这意味这一个对象可以从另一个对象继承属性。该语言是无类型的。(es6呢?)

new 调用一个函数,会创建一个连接到该函数的 prototype 成员的新对象,同时将 this 绑定到那个新对象上。这就是构造器调用。

Apply调用模式

因为JavaScript是一门函数式的面向对象语言,所以函数可以拥有方法。

apply 方法接受2个参数,绑定的 this ,和参数数组。

var array = [2, 4];
var sum  = add.apply(null, array);

闭包

一个函数可以访问它被创建时的上下文环境就叫闭包。

var myObject = (function(){
  var value = 0;
  return {
    increment: function(inc){
      value += typeof inc === 'number' ? inc : 1;
    },
    getValue: function(){
      return value;
    }
  }
})()

原理: 函数作用域链:当函数被定义时,它会创建一个作用域链。作用域链是一个指向外部函数的变量对象的列表。这意味着在函数内部,可以访问所有外部函数及全局作用域中的变量。 闭包的产生:当一个函数内部定义了另一个函数,并且内部函数引用了外部函数的变量时,就形成了闭包。由于内部函数保持对外部函数作用域的引用,即使外部函数执行完毕后,内部函数仍然可以访问外部函数的变量,因此这些变量不会被销毁,形成了闭包。

Read more ⟶

ARTS打卡


Algorithm

每周至少做一个LeetCode的算法题。为了编程训练和学习,只看书不训练是没用的。

Review

阅读并点评至少一篇英文技术文章。为了学习英文。

Tip

学习至少一个技术技巧,为了总结和归纳在日常工作中遇到的知识点。

Share

分享一篇有观点和思考的技术文章,为了建立影响力,输出价值观。

Read more ⟶

React Spring


react-spring 是一个基于弹簧物理学的动画库。

最基本的用法:

import {useSpring, animated} from 'react-spring'

function App() {
  const props = useSpring({opacity: 1, from: {opacity: 0}})
  return <animated.div style={props}>I will fade in</animated.div>
}

其中的useSpring可以创造一个js动画,这种动画默认不需要设置持续时间,他通过一些弹簧参数来控制动画的表现。可以通过config设置这些参数,像这样:

useSpring({ config: { duration: 250 }, ... })

参数有哪些可以看Common api这节文档。

useSpring({opacity: 1, from: {opacity: 0}})

from为动画开始的值,1为动画最后的值。

useSpring({opacity: 1, to: {opacity: 0}})

1为动画开始的值,to为动画最后的值。

如果useSpring中变化的值可以直接使用,比如颜色、数字,则可以直接使用

<animated.div style={props}>I will fade in</animated.div>

或这样

<animated.span>{props.number}</animated.span>

如果useSpring中变化的值需要组合成字符串,比如transform,则需要使用插值函数(interpolate)来实现

<animated.div
  style={{
    background: o.interpolate(o => `rgba(210, 57, 77, ${o})`),
    transform: xyz.interpolate((x, y, z) => `translate3d(${x}px, ${y}px, ${z}px)`),
    border: interpolate([o, color], (o, c) => `${o * 10}px solid ${c}`),
    padding: o.interpolate({range: [0, 0.5, 1], output: [0, 0, 10]}).interpolate(o => `${o}%`),
    borderColor: o.interpolate({range: [0, 1], output: ['red', '#ffaabb']}),
    opacity: o.interpolate([0.1, 0.2, 0.6, 1], [1, 0.1, 0.5, 1])
  }}
>
  {o.interpolate(n => n.toFixed(2)) /* innerText interpolation ... */}
</animated.div>

useSpring中传值可以是任意的字段

useSpring({everything: 1, to: {everything: 0}})

可以在代码中更新spring

Read more ⟶

[机翻]如何解决问题


此为机翻文章,原文在此

解决问题方法

当遇到新问题时,你该怎么做?

1.理解、明白

确切的知道要问什么。大多数难题之所以难是因为你不理解它。

怎么知道你理解一个问题呢?当你可以简单的术语解释它的时候。

你还记得吗,当你被一个问题卡住,你开始解释它,你会立即发现以前从未见过的逻辑漏洞?

多数程序员知道这种感觉。

“If you can’t explain something in simple terms, you don’t understand it.” — Richard Feynman

2.计划

不要没有计划就直接解决问题(以某种方式希望您能摸索到底)。规划您的解决方案!

如果你不能写下具体的步骤,将无济于事。在编程中,这意味着不要马上开始写代码。要给你的大脑时间,处理问题、分析信息。

为这个为题给出一个计划:

“当输入X时,有哪些必要的步骤才能输出Y?”

旁注:程序员有一个很棒的工具来帮助他们。

3.划分

请注意。这是最重要的一步。

不要试图解决一个大问题。你会哭。而是将其分解为多个子问题。这些子问题更容易解决。

然后,一个一个地解决每个子问题。从最简单的开始。最简单意味着您知道答案(或更接近答案)。

此后,最简单的方法意味着要解决的子问题不依赖于要解决的其他问题。

解决了每个子问题后,将点连接起来。连接所有“子解决方案”将为您解决原始问题。恭喜你!

该技术是解决问题的基石。记住这一点(如果需要,请再次阅读此步骤)。

4.卡住了吗?

到现在为止,您可能坐在那里想:“嗨,理查德……太酷了,但是,如果我被卡住甚至不能解决子问题怎么办?”

首先,深呼吸。第二,这很公平。

朋友,请不要担心。这发生在每个人身上!不同之处在于,最好的程序员/问题解决者对bugs/errors的好奇大于对错误的恼怒。

实际上,面对混乱时,可以尝试以下三件事:

  1. 调试:逐步解决您的解决方案,尝试找出问题所在。程序员将其称为调试(实际上,这是调试器的全部工作)。
  2. 重新评估: 退后一步。从另一个角度看问题。有什么可以抽象为更通用的方法的吗?
  3. 研究: 啊,Google不错。您没看错。无论您遇到什么问题,都可能有人解决了。找到那个人/解决方案。实际上,即使您解决了问题,也要这样做!(您可以从其他人的解决方案中学到很多东西)。

警告:不要为大问题寻找解决方案。只寻找子问题的解决方案。为什么?因为除非您奋斗(一点点),否则您将不会学到任何东西。如果您什么都不学,那您就浪费了时间。

实践

仅仅一周之后,别指望自己变得很棒。如果您想成为一个好的问题解决者,请解决很多问题!

实践。实践。实践。认识到“使用“在此处插入概念”可以轻松解决此问题”只是时间问题。

怎么练习?wazoo有多种选择!

国际象棋难题,数学问题,数独,围棋,专卖,视频游戏,加密小猫,等等……等等……等等……。

实际上,在成功人士中,常见的习惯是练习“解决微观问题”的习惯。例如,彼得·泰尔(Peter Thiel)下棋,伊隆·马斯克(Elon Musk)玩电子游戏。

例如,我喜欢编码方面的挑战。每天,我都会尝试解决至少一个难题(通常在Coderbyte上)。

就像我说的,所有问题都有相似的模式。

结论

那是所有人! 现在,您更好地了解了“像程序员一样思考”的含义。 您还知道解决问题是一种不可思议的技能(超能力)。 如果这还不够,请注意您还知道如何去练习解决问题的技能! ew……挺酷的吧? 最后,祝您遇到许多问题。 您没看错。至少现在您知道如何解决它们了!(此外,您将了解到每种解决方案都可以改进)。

“只要您认为自己已经成功克服了一个障碍,就会出现另一个障碍。但这就是让生活变得有趣的原因。 生活是突破这些障碍的过程,这是我们必须突破的一系列防御性路线。 每次,您都会学到一些东西。 每次,您都会发展力量,智慧和远见。 每次,更多的竞争都会消失。直到剩下的只有你:你最好的版本。” —瑞安·霍里

Read more ⟶

了解Hugo


修改代码高亮主题

  • 攻略:https://makewithhugo.com/syntax-hightlight-color/
  • 主题列表:https://xyproto.github.io/splash/docs/all.html
  1. 使用命令生成主题样式文件
    hugo gen chromastyles --style=dracula > syntax.css
    
  2. 将css文件放到 static/css/syntax.css
  3. 找到hugo主题的head位置,比如hugo-book主题的可以在这里设置html的head
    themes/hugo-book/layouts/partials/docs/inject/head.html
    

接着重新编译就可以了。如果发现样式有问题,考虑是hugo主题影响到了syntax样式。还是 hugo-book 主题。它的 _markdown.scss 中有两端关于 markdown 的两处背景色就影响到了。

这个博客是使用hugo搭建的,选择来一个大体喜欢的主题。但是有一些细节还是不够满意,所以如何改造hugo主题,加上自己想要的内容,就成了一个值得研究的问题。

Sections

content目录下的各个一级子目录就是一个section,它们是first-level的section,可以为它们定义layout组织内容,并通过url来访问(默认就是目录)。

一级子目录下也可有任意深度的子目录,只要子目录中定义_index.md就可以作为一个section。

section除了可以通过以目录层级为url访问,还可以获得到属于它的子文章列表。

分类法(Taxonomies)

我想解决的第一个问题就是文章的分类,因为一个单纯的列表看上去可能有点散乱。观察创建文章的可选参数,以及其他博客。可以确定hugo是支持分类的。在官网文档中的Content Management下有Taxonomies,阅读内容后可以确定,这就是我想找的东西。

在hugo中,用“Taxonomies”这个术语表示“文章的分类”。相关的有三个概念:

  • Taxonomy -> 一个分类
  • Term -> 一个分类的项目
  • Value -> 一个项目的值

比如:

Year                <- Taxonomy
    2018              <- Term
        前端入门          <- Value
        Vue入门          <- Value
        React入门        <- Value
    2019              <- Term
        前端进阶          <- Value
        vue进阶           <- Value
        react进阶         <- Value
categories         <- Taxonomy
    css              <- Term
        flex布局          <- Value
        css module       <- Value
        background渐变色  <- Value
    框架              <- Term
        Vue入门           <- Value
        React入门         <- Value
        vue进阶           <- Value
        react进阶         <- Value

这里的“value”对应的都是文章的题目,“term”对应一个分类中具体有哪些项,“taxonomy”则是我们预先定义好的分类的名字。

Read more ⟶

职业发展


七个对我最重要的职业建议(阮一峰翻译)

ruanyifeng

一、不要别人点什么就做什么

“不要做一个别人点了什么才就烧什么的厨师,也不要这样的地方工作,你要去一个地方,那里的人能肯定你对产品的想法,相信你的能力,放手让你去做。”

单单实现一个产品是不够的,你还必须参与决定怎么实现。好的工程师并不仅仅服从命令,而且还会给出反馈,帮助产品的拥有者改进它。

🤔从技术角度改进产品?或者技术角度的feature吗?比如实现更好的交互,新的技术可以做更好的事情?

🤔不能只是让别人给你一个技术方案你只负责实现它,而是要自己能设计一个方案,甚至可以根据自己的技术给出一个让不同feature变成高级的feature。比如更节省成本,时间少人力少、效率高机器成本低、交互好、更美观、用户体验更好等等。总之就是,因为你的一些想法,原来那个别人提出来的东西别的更好了。

🤔对自己有什么好处呢?输出一些想法,肯定是要付出精力的,那么这些精力能不能有所回报呢?首先,它能体现分析、解决问题的能力,体现积极、负责,其次,进一步端粒自己分析、解决问题的能力,锻炼表达能力,这些经验多了起来,就相对其他人来说是一种优势,能创造出一些价值,可以写在简历中,对某某功能提出哪些想法,使成本降低了多少,收益增加了多少。

二、推销自己

“为了让其他人相信你,你必须首先让别人知道你做了什么。你需要推销自己,引起别人的注意。”

公司的其他人需要明白你的价值,最好的办法就是告诉别人你做了什么。

🤔写邮件告诉别人真的好吗?可能还是写博客好一点吧,但是博客很难找到读者,可以通过掘金、csdn之类的引流一下。

三、学会带领团队

“当你的技术能力过关以后,就要考验你与他人相处的能力了。”

如何带领一个团队,有效地与其他人协同工作,取到更大的成果。

🤔先看一下左耳朵的文章学习一下沟通技术。

🤔目前我只需要考虑一二三这几个问题。

四、生活才是最重要的

五、自己找到道路

“以前都是我们告诉你做什么,从现在开始,你必须自己回答这个问题了,我期待你来告诉我,什么事情需要做。”

很多工程师都没有完成这个转变,如果能够做到,可能就说明你成熟了,学会了取舍。你不可能把时间花在所有事情上面,必须找到一个重点。

六、把自己当成主人

“不要再去开这样的会了。你参加一个会,那是因为你参与了某件事。如果不确定自己为什么要在场,就停下来问。如果这件事不需要你,就离开。不要从头到尾都静静地参加一个会,要把自己当成负责人,大家会相信你的。”

从那时起,我从没有一声不发地参加会议。我确保只参加那些需要我参加的会议。

七、找到水平更高的人

“找到那些比你水平更高、更聪明的人,尽量和他们在一起,吃饭或者喝咖啡,向他们讨教,了解他们拥有的知识。你的职业,甚至你的生活,都会因此变得更好。”

面试时,如何向公司提问?

ruanyifeng

有一些注意点,你需要知道:

  1. 面试之前,一定要做准备,多了解公司的情况。
  2. 你提出的问题,应该围绕"这份工作是否合适我"这个中心点,其他与应聘关系不大的问题,不宜多问。
  3. 提问的时候,要自然放松,不要害羞,就把它当作普通的聊天。你要表现出对公司的真诚兴趣。
  4. 提问要直接了当,不要绕圈子。提出问题之后,你要保持安静,让面试官多说话。
  5. 面试官回答的时候,你可以做笔记,或者事先询问能不能做。笔记必须简短,你的大部分时间,要用来全神贯注倾听面试官的回答,并与其有眼神的交流。
  6. 面试结束后一周内,最好打一个电话或发一封邮件,了解公司对你的反馈意见。即使面试失败,你不妨也问一下原因,这会有助于你以后的面试。

6个问题

  1. 为什么招人,之前的人离职了还是公司增长扩张。
  2. 为什么大家想留在你们公司。公司的文化、价值观、环境对员工的影响。
  3. 如果被录用了,在上班的头两三个月,公司希望我做到的三件事是什么?
  4. 一个人像成功地做好这份工作,需要哪些东西?
  5. 我刚才说过的话里,是否有哪些内容让你华裔我不适合这份工作。
  6. 你们什么时候会做最后的决定?

围绕“这份工作是否合适我”提问

下面是一些你可以问的典型问题。

问题一:你们为什么要招聘这个职位?

这个问题会使得面试官开始谈论当前的项目,或者谈论前一位离职人员。无论哪种情况,都会让你了解,一些与你最密切相关的公司情况。

问题二:你们的新员工多吗?

这个问题起一个过渡作用,使得谈话导向公司内部的情况。但是,它本身也能说明一些问题。如果公司成立已经超过四年,又没有新项目,但是新员工却很多,这往往说明公司文化不是很健康。

问题三:你们公司(团队)目前面临的最大挑战是什么?

如果面试官开始谈论一些具体的技术问题,这很好;如果他的回答是项目时间紧迫,或者需要更多的资金,那你就要小心一点了,公司管理上面可能有问题。

问题四:什么新技术(编程语言)是你们未来希望采用的?

如果你申请的是技术职位,面试官恰巧又是技术负责人,那么这个问题将会非常合适。你会对公司的技术路线有所了解和准备,一旦入职,就能更好地适应公司的需要。

问题五:在业务方面,有没有什么地方是你们不满意的,未来想要改进的?

很少有公司,会百分之百满意自身的现状,即使那些状况很良好的公司也是如此。这个问题可以让你对公司管理层的关注重点和担忧之处,有所了解。

问题六:我申请的这个职位,对公司的业务有何影响?

这个问题会让你了解自己在公司的角色,以及你的岗位对公司是否重要。

如何提高求职时的谈判能力?

(1)记住你不是在求职,不是在展示编程技巧,而是在推销某种商业问题(增加收入或降低成本)的解决方案。

(2)面试时,要有自信,要平等的对话。你要的是一个互利的录用合同,不要每次对方提出要求,你都说Yes。

(3)雇主可能会问"你的上一份工资是多少",他们其实在说"给我一个理由,压低你的报酬"。你要想好如何适当地回答这个问题。

(4)要还价。这里不仅仅指钱,还指其它你关心的方面。如果你无法要求更高的薪水,那就试着要求更多的假期。

(5)在对方决定录用你以后,才开始讨论薪水。因为那时,他们已经在你身上,投入了大量的时间和金钱,产生了一定的成本,此时他们可能觉得一些小问题已经不值得再纠缠了,比如每年的工资增加几千元。

产品五问

  1. 给谁用?
  2. 他们用这个产品来解决什么问题?
  3. 这个问题对他们而言有多重要?
  4. 我们的方法是否足够简单方便?
  5. 他们要付出的代价与所得是否匹配?

创业公式

Paul Graham的创业公式就是:搭建原型、上线运营(别管bug)、收集反馈、调整产品、成长壮大。

Read more ⟶