Package: add 1000-hours repo in workspace (#337)

* add 1000-hours repo in workspace

* update README
This commit is contained in:
an-lee
2024-02-20 15:40:18 +08:00
committed by GitHub
parent 66bad2002c
commit dab09ea644
385 changed files with 21653 additions and 36 deletions

7
.gitignore vendored
View File

@@ -82,6 +82,9 @@ typings/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Webpack
.webpack/
@@ -97,6 +100,7 @@ package-lock.json
# vscode
.vscode/
.vscode-test
# Yarn Berry (v2+)
# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
@@ -124,3 +128,6 @@ ggml-*.bin
ffmpeg-core.wasm
ffmpeg-core.js
ffmpeg-core.worker.js
.vitepress/cache/
/public/jupyter-notebooks/*.mp3

139
1000-hours/.gitignore vendored Normal file
View File

@@ -0,0 +1,139 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
.DS_Store
./public/jupyter-notebooks/*.mp3
.vitepress/cache/
.jupyter
.ipynb_checkpoints

View File

@@ -0,0 +1,201 @@
import { defineConfig } from 'vitepress'
import { withMermaid } from 'vitepress-plugin-mermaid'
import footnote from 'markdown-it-footnote'
import sup from 'markdown-it-sup'
import sub from 'markdown-it-sub'
import mark from 'markdown-it-mark'
import ins from 'markdown-it-ins'
// import markdownit from 'markdown-it'
export default withMermaid(
// https://vitepress.dev/reference/site-config
defineConfig({
title: "1000 小时",
description: "用注意力填满 1000 小时就能练成任何你需要的技能……",
head: [
[ 'script', { async: '', src: 'https://www.googletagmanager.com/gtag/js?id=G-Z2QZPX3T9W' } ],
[
'script', {},
`window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-Z2QZPX3T9W');`
],
['link', { rel: 'icon', href: '/images/clock.svg' }]
],
themeConfig: {
// https://vitepress.dev/reference/default-theme-config
nav: [
{ text: 'Home', link: '/' },
// { text: 'Examples', link: '/markdown-examples' }
],
search: {
// provider: 'local'
provider: 'algolia',
options: {
appId: 'QF5TVZ8TIO',
apiKey: '8dac3a5e27daaaf57efc72604ca08b98',
indexName: '1000h_prod'
}
},
sidebar: [
{
text: '简要说明', collapsed: true, link: '/intro',
items: [
{ text: '1. 要不要健脑?', link: '/why' },
{ text: '2. 什么最健脑?', link: '/what' },
]
},
{
text: '训练任务', collapsed: true,
items: [
{ text: '1. 启动任务', link: '/training-tasks/kick-off' },
{ text: '2. 训练方法', link: '/training-tasks/procedures' },
{
text: '3. 人工智能', collapsed: false, link: '/training-tasks/ai',
items: [
{ text: '3.1. 基础语言能力', link: '/training-tasks/language' },
{ text: '3.2. 成年人的困境', link: '/training-tasks/predicaments' },
{ text: '3.3. 人工智能辅助', link: '/training-tasks/revolution' },
{ text: '3.4. 任务并不高级', link: '/training-tasks/ground' },
{ text: '3.5. 效果非常惊人', link: '/training-tasks/wonder' },
]
},
{ text: '4. 意料之外', link: '/training-tasks/surprise' },
]
},
{
text: '语音塑造', collapsed: true,
items: [
{
text: '1. 基础', collapsed: true, link: '/sounds-of-english/01-basics',
items: [
{ text: '1.1. 音素', collapsed: true, link: '/sounds-of-english/01-phonemes',
items: [
{ text: '1.1.1. 元音', link: '/sounds-of-english/01-1-vowels' },
{ text: '1.1.2. 辅音', link: '/sounds-of-english/01-2-consonants' },
{ text: '1.1.3. 美式语音标注', link: '/sounds-of-english/01-3-us-phonemes' },
{ text: '1.1.4. 示例', link: '/sounds-of-english/01-4-pangram' }
]
},
{ text: '1.2. 音节', link: '/sounds-of-english/02-syllables' }
]
},
{
text: '2. 详解', collapsed: true, link: '/sounds-of-english/03-details',
items: [
{ text: '2.1. 元音', collapsed: false, link: '/sounds-of-english/03-vowels-overview',
items: [
{ text: '2.1.1. 口腔内气流共鸣位置', link: '/sounds-of-english/04-vowel-positions' },
{ text: '2.1.2. ʌ/ɑː', link: '/sounds-of-english/05-Ʌ' },
{ text: '2.1.3. e/æ', link: '/sounds-of-english/06-e' },
{ text: '2.1.4. ə/əː', link: '/sounds-of-english/07-ə' },
{ text: '2.1.5. ɪ/iː', link: '/sounds-of-english/08-i' },
{ text: '2.1.6. ʊ/uː', link: '/sounds-of-english/09-u' },
{ text: '2.1.7. ɔ/ɔː', link: '/sounds-of-english/10-ɔ' },
{ text: '2.1.8. aɪ, eɪ, ɔɪ, aʊ, əʊ, eə, ɪə, ʊə', link: '/sounds-of-english/11-aɪ' },
]
},
{ text: '2.2. 辅音', collapsed: false, link: '/sounds-of-english/12-consonants-overview',
items: [
{ text: '2.2.1. p, b, m, n, f, k, g, h', link: '/sounds-of-english/13-pbmnfkgh' },
{ text: '2.2.2. f, v', link: '/sounds-of-english/14-fv' },
{ text: '2.2.3. m, n, ŋ', link: '/sounds-of-english/15-mn' },
{ text: '2.2.4. t, d, s, z; ʃ, tʃ, dʒ', link: '/sounds-of-english/16-tdsz' },
{ text: '2.2.5. t, d', link: '/sounds-of-english/17-td' },
{ text: '2.2.6. tr, dr, ts, dz', link: '/sounds-of-english/18-trdr' },
{ text: '2.2.7. sp, st, sk', link: '/sounds-of-english/19-sptk' },
{ text: '2.2.8. h', link: '/sounds-of-english/20-h' },
{ text: '2.2.9. θ, ð', link: '/sounds-of-english/21-θð' },
{ text: '2.2.10. r', link: '/sounds-of-english/22-r' },
{ text: '2.2.11. l', link: '/sounds-of-english/23-l' },
{ text: '2.2.12. ʒ', link: '/sounds-of-english/24-ʒ' },
{ text: '2.2.13. j, w', link: '/sounds-of-english/25-jw' },
]
},
{ text: '2.3. 连读', link: '/sounds-of-english/26-catenation' },
{ text: '2.4. 音标学习', link: '/sounds-of-english/27-learning-phonetics' },
{ text: '2.4. 英美口音选择', link: '/sounds-of-english/28-choosing-accent' },
]
},
{
text: '3. 进阶', collapsed: true, link: '/sounds-of-english/29-advanced',
items: [
{ text: '3.1 什么更重要?', link: '/sounds-of-english/30-more-important' },
{ text: '3.2 停顿', link: '/sounds-of-english/31-pause' },
{ text: '3.3 高低', link: '/sounds-of-english/32-high-low' },
{ text: '3.4 起伏', link: '/sounds-of-english/33-up-down' },
{ text: '3.5 轻重', link: '/sounds-of-english/34-strong-weak' },
{ text: '3.6 缓急', link: '/sounds-of-english/35-fast-slow' },
]
},
{
text: '4. 收官', collapsed: true, link: '/sounds-of-english/36-round-up',
items: [
{ text: '4.1 流利', link: '/sounds-of-english/37-fluent' },
{ text: '4.2 情绪', link: '/sounds-of-english/38-emotional' },
]
}
]
},
{
text: '大脑内部', collapsed: true,
items: [
{ text: '1. 小空间大世界', link: '/in-the-brain/01-inifinite' },
{ text: '2. 一切都是连接', link: '/in-the-brain/02-links' },
{ text: '3. 一切都是体育课', link: '/in-the-brain/03-sports' },
{ text: '4. 一切都是语文课', link: '/in-the-brain/04-literature' },
{ text: '5. 一切都需要能量', link: '/in-the-brain/05-energy' },
{ text: '6. 用进废退循环利用', link: '/in-the-brain/06-use-or-lose' },
{ text: '7. 短时间内足量重复', link: '/in-the-brain/07-repitition' },
{ text: '8. 新旧网络间的竞争', link: '/in-the-brain/08-compitition' },
{ text: '9. 注意不到就不存在', link: '/in-the-brain/09-unnoticed' },
{ text: '10. 熟练就是卸载负担', link: '/in-the-brain/10-unloading' },
{ text: '11. 被关注是最大负担', link: '/in-the-brain/11-burden' },
{ text: '12. 有限排它不可再生', link: '/in-the-brain/12-unreproducible' },
{ text: '13. 一切都是化学反应', link: '/in-the-brain/13-chemical' },
{ text: '14. 安全阈值决定成果', link: '/in-the-brain/14-threshold' },
]
},
{
text: '自我训练', collapsed: true, link: `/self-training/00-intro`,
items: [
{ text: '1. 用兵打仗', link: '/self-training/01-fight' },
{ text: '2. 只能自学', link: '/self-training/02-last-resort' },
{ text: '3. 生学硬练', link: '/self-training/03-trials-and-errors' },
{ text: '4. 走出迷宫', link: '/self-training/04-maze' },
{ text: '5. 自我纠正', link: '/self-training/05-correction' },
{ text: '6. 自主驱动', link: '/self-training/06-motives' },
{ text: '7. 自我鼓励', link: '/self-training/07-encouraging' },
{ text: '8. 自我监督', link: '/self-training/08-supervising' },
{ text: '9. 自主计划', link: '/self-training/09-planning' },
{ text: '10. 返璞归真', link: '/self-training/10-going-back' },
]
},
],
socialLinks: [
{ icon: 'github', link: 'https://github.com/xiaolai/everyone-can-use-english/1000-hours' }
]
},
markdown: {
// https://vitepress.dev/reference/markdown
math: true,
config: (md) => {
// use more markdown-it plugins!
md.use(footnote)
md.use(sub)
md.use(sup)
md.use(mark)
md.use(ins)
},
// toc: {
// level: [2, 3, 4]
// }
}
})
);

View File

@@ -0,0 +1,66 @@
.speak-word {
display: flex;
align-items: center;
gap: 0.5rem;
border-top: 1px solid #d87676;
padding: 8px 0;
.ctrl {
display: flex;
align-items: center;
}
.ctrl-part {
display: flex;
align-items: center;
}
.ctrl .divider {
width: 1px;
height: 24px;
background-color: rgba(0, 0, 0, 0.1);
margin: 0 16px 0 6px;
}
.accent-label {
margin-right: 4px;
opacity: 0.7;
text-transform: uppercase;
font-size: 16px;
}
.word {
font-size: 16px;
font-weight: bold;
color: #af4c4c;
}
audio {
display: none;
}
.spacer {
flex-grow: 1;
}
.pos {
opacity: 0.7;
font-size: 16px;
}
.play-button {
border: none;
border-radius: 4rem;
padding: 0;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 28px;
cursor: pointer;
height: 28px;
width: 48px;
display: flex;
align-items: center;
.icon {
cursor: pointer;
opacity: 0.7;
height: 14px;
width: 14px;
}
}
}
.speak-word:last-child {
border-bottom: 1px solid #d87676;
}

View File

@@ -0,0 +1,99 @@
<template>
<div class="speak-word">
<div class="word" >
{{ props.word }}
</div>
<div v-if="pos" class="pos">
{{ props.pos }}
</div>
<div class="spacer"></div>
<div class="ctrl">
<div class="ctrl-part" :class="item.label" v-for="item, ix in audios" :key="`audio-${ix}`">
<div v-if="ix !== 0" class="divider"></div>
<button class="play-button" :class="item.label" @click="playAudio(item.label)">
<span class="accent-label">{{ item.label }}</span>
<img :src="svgUrl(item.label)" class="icon" alt="sound" />
</button>
<audio class="audio" :class="item.label" :src="item.audio" controls="false" ></audio>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { computed, onMounted, ref } from "vue";
import { getAudioPath } from "../data";
const props = defineProps({
word: {
type: String,
required: true,
},
audioUs: {
type: String,
},
audioUk: {
type: String,
},
audioOther: {
type: String,
},
pos: {
type: String,
},
});
const svgUrl = (accent) => {
if (accent === 'uk') {
return '/images/speaker-brown.svg';
} else if (accent === 'us') {
return '/images/speaker-blue.svg';
}
return '/images/speaker-black.svg';
}
const audioPathUS = computed(() => {
if (props.audioUs) {
return props.audioUs;
}
return getAudioPath(props.word, "us")
});
const audioPathUK = computed(() => {
if (props.audioUk) {
return props.audioUk;
}
return getAudioPath(props.word, "uk")
});
const audioPathOther = computed(() => {
if (props.audioUk) {
return props.audioUk;
}
return getAudioPath(props.word, "other")
});
const audios = computed(() => {
const ret:any = [];
if (audioPathUS.value) {
ret.push({ label: 'us', audio: audioPathUS.value});
}
if (audioPathUK.value) {
ret.push({ label: 'uk', audio: audioPathUK.value});
}
if (audioPathOther.value) {
ret.push({ label: 'other', audio: audioPathOther.value});
}
return ret;
});
function playAudio(accent) {
const audioEl:any = document.querySelector(`audio.${accent}`);
audioEl.play();
}
</script>
<style lang="scss" scoped>
@import url(./SpeakWord.scss);
</style>

View File

@@ -0,0 +1,142 @@
<script setup>
import { onMounted, watch } from "vue";
import { useRouter } from 'vitepress';
const router = useRouter();
watch(() => router.route.data.relativePath, (newVal, oldVal) => {
if (newVal !== oldVal) {
setTimeout(() => {
buildSpeakWordInline();
console.log("route changed", newVal, oldVal);
}, 200);
}
}, { immediate: true });
function buildPlayButton(parent, accent, url) {
const labelEl = document.createElement('span');
labelEl.classList.add('accent-label');
labelEl.innerText = accent.toUpperCase();
const audioEl = document.createElement('audio');
audioEl.classList.add('audio')
audioEl.setAttribute('src', url)
audioEl.setAttribute('controls', 'false')
const iconEl = document.createElement('img');
iconEl.classList.add('icon');
let svg = '/images/speaker-black.svg';
if (accent === 'uk') {
svg = '/images/speaker-brown.svg';
} else if (accent === 'us') {
svg = '/images/speaker-blue.svg';
}
iconEl.setAttribute('src', svg)
iconEl.innerText = accent.toUpperCase();
const btnEl = document.createElement('button')
btnEl.classList.add('play-button')
btnEl.classList.add(accent);
btnEl.addEventListener('click', () => {
audioEl.play();
})
// btnEl.append(labelEl)
btnEl.append(iconEl)
btnEl.append(audioEl)
parent.append(btnEl)
}
function convertToInlineComponent(el) {
if (el.getAttribute('data-converted')) {
return;
}
const dataAudioUs = el.getAttribute('data-audio-us')
const dataAudioUk = el.getAttribute('data-audio-uk')
const dataAudioOther = el.getAttribute('data-audio-other')
console.log('inline component', dataAudioUs, dataAudioUk, dataAudioOther)
const wrapperEl = document.createElement('div')
wrapperEl.classList.add('speak-word-wrapper')
const canEl = document.createElement('div')
canEl.classList.add('speak-word')
canEl.classList.add('inline')
if (dataAudioUk || dataAudioUs || dataAudioOther) {
const ctrlEl = document.createElement('div')
ctrlEl.classList.add('ctrl')
const ctrlPartEl = document.createElement('div')
ctrlPartEl.classList.add('ctrl-part')
if (dataAudioUs) {
buildPlayButton(ctrlPartEl, 'us', dataAudioUs)
}
ctrlEl.append(ctrlPartEl);
const ctrlPartEl2 = document.createElement('div')
ctrlPartEl2.classList.add('ctrl-part')
if (dataAudioUk) {
buildPlayButton(ctrlPartEl2, 'uk', dataAudioUk)
}
ctrlEl.append(ctrlPartEl2);
const ctrlPartEl3 = document.createElement('div')
ctrlPartEl3.classList.add('ctrl-part')
if (dataAudioOther) {
buildPlayButton(ctrlPartEl3, 'other', dataAudioOther)
}
ctrlEl.append(ctrlPartEl3);
canEl.append(ctrlEl)
}
wrapperEl.append(canEl)
// insert at el's side
el.insertAdjacentElement('afterend', wrapperEl)
el.style.display = 'none'
el.setAttribute('data-converted', 'true')
}
function buildSpeakWordInline() {
const inlinePlayerEls = document.querySelectorAll('.speak-word-inline')
for (let i = 0; i < inlinePlayerEls.length; i += 1) {
convertToInlineComponent(inlinePlayerEls[i]);
}
}
</script>
<template>
</template>
<style lang="scss">
@import url(./SpeakWord.scss);
.speak-word-wrapper {
display: inline-block;
margin: 0px;
vertical-align: middle;
}
.speak-word.inline {
border: none;
display: flex;
padding: 0;
.word {
display: inline-block;
}
.ctrl-part {
.play-button {
display: flex;
width: 24px;
height: 24px;
align-items: center;
justify-content: center;
.icon {
width: 16px;
height: 16px;
}
}
.accent-label {
font-size: 14px;
display: inline-block;
color: white;
}
}
}
</style>

View File

@@ -0,0 +1,9 @@
<template>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m9.5 16.5l7-4.5l-7-4.5zM12 22q-2.075 0-3.9-.788t-3.175-2.137q-1.35-1.35-2.137-3.175T2 12q0-2.075.788-3.9t2.137-3.175q1.35-1.35 3.175-2.137T12 2q2.075 0 3.9.788t3.175 2.137q1.35 1.35 2.138 3.175T22 12q0 2.075-.788 3.9t-2.137 3.175q-1.35 1.35-3.175 2.138T12 22m0-2q3.35 0 5.675-2.325T20 12q0-3.35-2.325-5.675T12 4Q8.65 4 6.325 6.325T4 12q0 3.35 2.325 5.675T12 20m0-8"/></svg>
</template>
<script>
export default {
name: 'PlayCircleOutline'
}
</script>

View File

@@ -0,0 +1,5 @@
import PlayCircleOutline from './PlayCircleOutline.vue'
export {
PlayCircleOutline
}

View File

@@ -0,0 +1,13 @@
function getAudioPath(word, accent) {
word = word.toLowerCase();
accent = accent || 'us';
const item = mapping[word];
if (item && item[accent] && item[accent].length !== 0) {
return `/vendor/audios/${item[accent][0]}`
}
return '';
}
export {
getAudioPath
}

View File

@@ -0,0 +1,7 @@
@font-face {
font-family: 'Sauce Code Pro';
src: url('/fonts/SauceCodeProNerdFontMono-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}

View File

@@ -0,0 +1,21 @@
// https://vitepress.dev/guide/custom-theme
import { h } from 'vue'
import type { Theme } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import SpeakWord from './components/SpeakWord.vue'
import MyLayout from './layouts/index.vue'
import './style.scss'
export default {
extends: DefaultTheme,
Layout: MyLayout,
// Layout: () => {
// return h(DefaultTheme.Layout, null, {
// // https://vitepress.dev/guide/extending-default-theme#layout-slots
// })
// },
enhanceApp({ app, router, siteData }) {
// ...
app.component('SpeakWord', SpeakWord)
}
} satisfies Theme

View File

@@ -0,0 +1,52 @@
<script setup>
import DefaultTheme from 'vitepress/theme'
import SpeakWordInlineConverter from '../components/SpeakWordInlineConverter.vue'
const { Layout } = DefaultTheme
</script>
<template>
<Layout>
<template #doc-after>
<ClientOnly>
<SpeakWordInlineConverter />
</ClientOnly>
</template>
</Layout>
</template>
<style lang="scss">
@import url(../components/SpeakWord.scss);
.speak-word-wrapper {
display: inline-block;
margin: 0px;
vertical-align: middle;
}
.speak-word.inline {
border: none;
display: flex;
padding: 0;
.word {
display: inline-block;
}
.ctrl-part {
.play-button {
display: flex;
width: 24px;
height: 24px;
align-items: center;
justify-content: center;
.icon {
width: 16px;
height: 16px;
}
}
.accent-label {
font-size: 14px;
display: inline-block;
color: white;
}
}
}
</style>

View File

@@ -0,0 +1,198 @@
/**
* Customize default theme styling by overriding CSS variables:
* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css
*/
/**
* Colors
*
* Each colors have exact same color scale system with 3 levels of solid
* colors with different brightness, and 1 soft color.
*
* - `XXX-1`: The most solid color used mainly for colored text. It must
* satisfy the contrast ratio against when used on top of `XXX-soft`.
*
* - `XXX-2`: The color used mainly for hover state of the button.
*
* - `XXX-3`: The color for solid background, such as bg color of the button.
* It must satisfy the contrast ratio with pure white (#ffffff) text on
* top of it.
*
* - `XXX-soft`: The color used for subtle background such as custom container
* or badges. It must satisfy the contrast ratio when putting `XXX-1` colors
* on top of it.
*
* The soft color must be semi transparent alpha channel. This is crucial
* because it allows adding multiple "soft" colors on top of each other
* to create a accent, such as when having inline code block inside
* custom containers.
*
* - `default`: The color used purely for subtle indication without any
* special meanings attched to it such as bg color for menu hover state.
*
* - `brand`: Used for primary brand colors, such as link text, button with
* brand theme, etc.
*
* - `tip`: Used to indicate useful information. The default theme uses the
* brand color for this by default.
*
* - `warning`: Used to indicate warning to the users. Used in custom
* container, badges, etc.
*
* - `danger`: Used to show error, or dangerous message to the users. Used
* in custom container, badges, etc.
* -------------------------------------------------------------------------- */
@import url(./font.scss);
:root {
--vp-c-default-1: var(--vp-c-gray-1);
--vp-c-default-2: var(--vp-c-gray-2);
--vp-c-default-3: var(--vp-c-gray-3);
--vp-c-default-soft: var(--vp-c-gray-soft);
--vp-c-brand-1: var(--vp-c-indigo-1);
--vp-c-brand-2: var(--vp-c-indigo-2);
--vp-c-brand-3: var(--vp-c-indigo-3);
--vp-c-brand-soft: var(--vp-c-indigo-soft);
--vp-c-tip-1: var(--vp-c-brand-1);
--vp-c-tip-2: var(--vp-c-brand-2);
--vp-c-tip-3: var(--vp-c-brand-3);
--vp-c-tip-soft: var(--vp-c-brand-soft);
--vp-c-warning-1: var(--vp-c-yellow-1);
--vp-c-warning-2: var(--vp-c-yellow-2);
--vp-c-warning-3: var(--vp-c-yellow-3);
--vp-c-warning-soft: var(--vp-c-yellow-soft);
--vp-c-danger-1: var(--vp-c-red-1);
--vp-c-danger-2: var(--vp-c-red-2);
--vp-c-danger-3: var(--vp-c-red-3);
--vp-c-danger-soft: var(--vp-c-red-soft);
--vp-font-family-base: 'SF Pro SC','SF Pro Text','SF Pro Icons','PingFang SC','Helvetica Neue', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Helvetica, Arial, sans-serif;
--vp-font-family-mono: 'Sauce Code Pro', 'Source Code Pro', 'Courier New', monospace;
--vp-c-text-strong: rgb(63 86 99);
--vp-c-text-em: rgb(91, 4, 17);
}
.dark {
--vp-c-text-strong: rgb(138, 183, 209);
--vp-c-text-em: rgb(187, 121, 131);
}
body {
font-size: 16px;
}
/**
* Component: Button
* -------------------------------------------------------------------------- */
:root {
--vp-button-brand-border: transparent;
--vp-button-brand-text: var(--vp-c-white);
--vp-button-brand-bg: var(--vp-c-brand-3);
--vp-button-brand-hover-border: transparent;
--vp-button-brand-hover-text: var(--vp-c-white);
--vp-button-brand-hover-bg: var(--vp-c-brand-2);
--vp-button-brand-active-border: transparent;
--vp-button-brand-active-text: var(--vp-c-white);
--vp-button-brand-active-bg: var(--vp-c-brand-1);
}
/**
* Component: Home
* -------------------------------------------------------------------------- */
:root {
--vp-home-hero-name-color: transparent;
--vp-home-hero-name-background: -webkit-linear-gradient(
120deg,
#bd34fe 30%,
#41d1ff
);
--vp-home-hero-image-background-image: linear-gradient(
-45deg,
#bd34fe 50%,
#47caff 50%
);
--vp-home-hero-image-filter: blur(44px);
}
@media (min-width: 640px) {
:root {
--vp-home-hero-image-filter: blur(56px);
}
}
@media (min-width: 960px) {
:root {
--vp-home-hero-image-filter: blur(68px);
}
}
/**
* Component: Custom Block
* -------------------------------------------------------------------------- */
:root {
--vp-custom-block-tip-border: transparent;
--vp-custom-block-tip-text: var(--vp-c-text-1);
--vp-custom-block-tip-bg: var(--vp-c-brand-soft);
--vp-custom-block-tip-code-bg: var(--vp-c-brand-soft);
}
/**
* Component: Algolia
* -------------------------------------------------------------------------- */
.DocSearch {
--docsearch-primary-color: var(--vp-c-brand-1) !important;
}
.vp-doc {
p img, p video {
margin: 0 auto;
}
blockquote > p{
font-size: 16px;
}
.custom-block {
font-size: 16px;
}
strong, b {
color: var(--vp-c-text-strong);
font-weight: bold;
}
em, i {
color: var(--vp-c-text-em);
}
svg {
font-family: --vp-font-family-mono;
}
mjx-container {
display: inline-block;
margin: auto 1px -4px;
}
sup {
vertical-align: top;
position: relative;
top: -0.5em;
}
}

5
1000-hours/README.md Normal file
View File

@@ -0,0 +1,5 @@
# 1000 Hours with Attention Paid
This is the repo of [1000h.org](https://1000h.org).
By paying your attention into 1000 hours, you can master anything you need.

View File

@@ -0,0 +1,11 @@
# 1. 小空间大世界
人类的大脑内有大约有 11,000 亿个脑细胞…… 这么大的一个数字到底是多少呢?每个人大脑里的脑细胞数量,甚至比银河系里的恒星数量更多 —— 天文学家根据哈伯太空望远镜的深空影像平均推算,我们所在的银河系里,大约有 1000 亿到 4000 亿颗恒星……
在那么多的脑细胞中10,000 亿个是**神经胶质细胞**Glial Cell它们不放电不收发信号也不储存信息它们只是围绕着剩下的那 1000 亿个**神经元细胞**,将其固定在适当位置,使一个神经元与相邻的神经元绝缘,并为神经元提供营养和氧分…… 换言之,神经胶质细胞与知识、认知、控制没什么关系,它们不具备像神经元一样的开发潜力。
1000 亿个神经元之中,大约 150 亿个处于**大脑皮层**。人类的大脑皮层褶皱着铺在大脑的表面。若是展开的话,只不过大约 45 厘米见方2,000 平方厘米上下[^1],厚度不均,大约在 35 毫米之间,体积不到 1,000 立方厘米…… 整个人类的文明,本质上来看,都建立在大脑皮层之上。而一个人的世界,实际上全都发生在这 1000 立方厘米不到的空间里。
大脑内神经元中剩下更多的部分,那 850 亿个神经元是用来协调整个身体的 —— 毕竟,人体是一个超级复杂的机器,那么多的器官都需要从不间断地协同工作…… 并且,很多器官都可能身兼多职。比如我们的舌头,吃东西、尝味道,还要用来做其它动物完全做不了的事情,说话,甚至说很多种话。
[^1]: 1,843 ± 196 cm^2^Donahue et al., 2018

View File

@@ -0,0 +1,15 @@
# 2. 一切都是连接
我们能做的一切,对大脑来说,都只不过是 “**神经元间连接**”。
当然,我们能够完成的一切动作,无论是肢体动作还是思考过程,都复杂到不可能仅仅动用两个神经元间的连接就可以完成 —— 每一个我们认为轻而易举的动作,对大脑来说,都是一个又一个实际上非常庞大且又复杂的,由众多神经元连接起来构成的 “**基础功能局域网**”(学名 “**神经回路**”)相互通讯相互协作的结果。
而众多的 “基础功能局域网” 还可以灵活地组合,形成 “**高级功能局域网**” 完成更为复杂更为精巧的任务……
大脑内的神经元实在太多了,多到每个人都终生用不完的地步 —— 这就是为什么大脑具备极强**可塑性**的原因。即便大脑的某一部分损坏了,大脑还有充足的未启用神经元完全可以重新学会损坏的那一部分曾经拥有的功能 —— 弄不好可以学得更好。
大脑内的神经元通过相互连接构成了一个四通八达的网络。在这个网络里,不存在所谓的 “孤岛”,只不过是远近而已,只不过是直接间接而已,每个 “基础功能局域网” 之间最终都可以相互通讯。
这就意味着说,在大脑里,没有 “用不上的局域网”…… 任何技能,只要的确被大脑掌握,那么,本质上来看,它其实都是被拆解成很多个 “基础功能局域网” 之后存在于整个网络之中,随时组合起来调用。关键在于,这些基础功能局域网还随时可能用其它的方式组合起来,完成新的功能…… 所谓的 “融会贯通”,就是这样的过程。
对大脑来说,不可能存在学了之后竟然用不上的技能,学得越多越好,学得越多越快。人们生活中感受到的 “学了之后用不上”,其实是一种幻觉,因为对大脑来说,那原本应该是 “从来都没学会过”。

View File

@@ -0,0 +1,11 @@
# 3. 一切都是体育课
我们的中枢神经系统,主要由**白质**和**灰质**构成。白质由神经元的轴突组成,所以本身不具有处理信息的功能,仅仅在不同灰质之间或者灰质与周围器官之间传递信息。灰质是中枢神经系统中大量神经元聚集的部位,也是中枢神经系统对信息进行深入处理的部位。神经元之间存在大量突触作为通信途径,形成极其复杂的神经回路,实现多种多样的感觉、运动或中间信息处理。
人与人之间,虽然大脑的构成大体一致,但,各个组成部分的尺寸大小相互之间有着巨大的差别。这就好像虽然大家都是同样结构的肢体,但,健美运动员身上的每一块肌肉都可以更大一样。
一个人拥有的某项技能越强,相应部位的**灰质体积就越大且密度越高**;一个人拥有的技能越多,大脑皮层表面的**白质覆盖面积就越大**。对大脑进行的 fMRI 表明,音乐家、数学家,多语使用者,相对来看,都有体积更大密度更高的灰质以及覆盖面积更大的白质。
与体外可见的肌肉一样,对我们来说无法直接用自己的眼睛看到的大脑内每个部位,都可能会因为**专项训练**而体积增大密度变高。伦敦的出租车司机,与世界上其他的出租车司机相比,海马体的体积更大 —— 因为他们每天都要面对伦敦那无以伦比的复杂交通情况…… 这就是专项训练。而只需要经过一段时间之后,他们的海马体体积就变得越来越大…… 他们退休后,海马体体积多少会有点收缩,但,还是比普通人的大很多 —— 这就好像专业运动员退休之后,身体机能虽然会有所退化,但,依然与众不同。
从这个角度望过去,无论我们学什么,对大脑来说,其实没有任何区别,反正都是一模一样的**体育课** —— 创建连接、强化连接,构建新的基础功能局域网,组合新的高级功能局域网…… 肉眼可见的结果就是大脑内的某些相应部位面积变大体积变大密度变高。

View File

@@ -0,0 +1,15 @@
# 4. 一切都是语文课
人类的高速发展,建立在文字基础之上。没有文字,人类就只能像其它动物那样,靠遗传和变异在这个世界里缓慢且有随机地发展。有了文字之后,人类不仅可以即时沟通,还可以跨区域、跨时代地沟通,并且还能进行越来越复杂的记录、传播、思考、沟通……
毫不夸张地讲,一切的文明,都建立在文字之上。
每一次书写工具的改良,每一次文字的标准化,每一次传播工具的变革,都能同时引发整个世界巨大的进步。擅用文字的人越多,文字的传播就越多、思想的碰撞就越多,创新就越多…… 根据梅特卡夫定律,一个网络的价值与该网络中的节点数量的平方成正比。这就是人类的发展曲线越来越陡峭的最根本原因。
现在的人类不仅拥有语言文字,对其还有更为精确的划分:灵活但有些含混的**自然语言**,以及简单精确且毫无歧义的**人工语言**,在科学技术领域,比如,数学、物理、化学,逻辑、编程,人们所使用的都是人工语言。
曾经,有些人理解有误,非得把知识分为文科理科,好像它们是截然不同的两类东西,甚至有可能相互对立一样。然而对大脑来说,一切都是语文课,若是非说有什么差异的话,无非是一个可能使用自然语言更多,另外一个使用人工语言更多 —— 可问题在于,完全只用自然语言就完不成精巧复杂的工作,完全使用人工语言就无法更大面积传播。
所以,无论学什么知识,学什么技能,对大脑来说,其实都是语文课 —— 哪怕那些看起来完全属于体力范畴的技能,本质上也都是如此…… 大脑要理解,要总结,要归纳,要复习,要检索,要调用,要反思,更重要的是,总是要沟通 —— 这些都无一例外地依赖语言。
另外,从这个意义上来看,人类中有一部分早就把自己打造成了 “双语使用者”,他们可以同时熟练使用自然语言和人工语言。

View File

@@ -0,0 +1,13 @@
# 5. 一切都需要能量
大脑在重量上大约只占人体的 2%,却要消耗掉 20% 以上的能量。
大脑几乎从不停止运转,哪怕在睡觉的时候,它依然在按照自己的进程运转。大脑工作的时候,很多神经元在同时发电,不是比喻,就是物理发电 —— 就好像电池发电的原理一样,这是大脑内各类物质之间不断发生的化学反应带来的结果。
过去人们还不太理解,可现在脑科学家们却可以对大脑耗能进行精确的量化评估,数据表明,脑力活动的耗能效率远比体力活动高,也就是说,脑力工作相对更累。全世界所有作家都有相同的下意识动作,写着写着就饿了,写着写着就站起来冲向冰箱…… 大脑格外需要糖和氧,那些化学反应和物力放电,就是需要不断补充糖和氧才能持续下去。
大脑和身上的肌肉一样,累了就需要放松或者休息。与直觉相反的是,适当的体力活动往往更能起到放松大脑的作用。因为大脑对肢体支配太熟悉太自然了,几乎总是能以相当低的功耗就可以完成指定任务。再一次与直觉相反,若是躺在沙发上玩手机的话,那只是身体放松了,而大脑不仅没有休息,还是在继续超负荷工作。
用适当的体力活动放松大脑,还有另外一个好处。因为大脑的耗能占比太高,耗能功率太大,所以,大脑总是对糖过于贪婪。它其实不需要那么多糖,它只是觉得自己需要更多。问题在于,过多的糖对身体有害,会导致身体肥胖,大脑反应迟钝。相对于糖,其实大脑更需要的是氧,可又因为氧这个东西好像无处不在随时可以通过呼吸得到,大脑并不会对氧想对糖那样过分苛求。适当的体力活动,正好可以调控大脑对糖和氧的本末倒置,获得了更多实际必要的氧,消耗掉了相当一部分实际没必要的糖。
对大脑来说,最重要的是睡眠。高质量的睡眠是大脑工作效率的基础保障。稳定的作息时间虽然重要,但,充足的睡眠时长以及足够的睡眠质量才是关键。保证睡眠质量的方式,简单且又便宜,在保证适当的体力活动之外,还要保证充足的日晒 —— 这会让大脑分泌足够的褪黑素。

View File

@@ -0,0 +1,23 @@
# 6. 用进废退循环利用
大脑天生具备**节能倾向**,它就是对节能异常痴迷,只要可能它就会启动**节能模式** —— 而且,无需问询、没得商量、也不提供可选设置,动不动就直接进入节能模式……
首先,大脑会自动且又严格地执行大自然的规律,**用进废退**。
用得着的,不断进化,用不着的,就当它不存在。对大脑来说,它甚至不在乎某个东西是否属于自己的身体,只要用得足够多,大脑就会将其内化,认为是属于自己的。比如,你的手机,画家手里的笔,司机手中的方向盘,罗尼·奥沙利文手里的台球杆,足球场上 22 名运动员一起玩的球……
至于你身体上那些你自己并不常用或者并不在意的部位,比如,不会弹琴的手指,不会跑也跑不快的腿,不能分辨气味的鼻子,不能品尝味道的舌头,不能听清楚的耳朵,不能看清楚的眼睛…… 大脑对这类器官的态度是,随它去罢。
因为大脑的节能倾向,因为用进废退的执行,大脑总是倾向于只**按需学习**。它觉得没用的东西,它不会为其耗费能量,别人说什么都没用。若是它自己真觉得必需,谁都拦不住。为什么?就是为了节能。
大脑的节能倾向,还演化出了另外一个机制,**循环利用**。
大脑学会的一切,本质上都是连接,都是局域网…… 可问题在于,当初这些连接和局域网的创建,可是耗费了很多能量的!所以,大脑往往不会断掉那些连接,废弃那些局域网 —— 必须回收,必须留作它用。
大脑在进行循环利用的时候,对神经元间连接的强度也有要求,当然是优先采用那些强度更高的连接,当然优先采用那些通讯效率更高的局域网…… 反过来,在需要的时候,有更多更强的神经元连接、通讯效率更高的局域网可供循环利用,只能意味着学得更好学得更快。
这也是为什么有一部分人越老学得越多越快越好的根本原因。与大多数人误以为的相反,大脑原本就应该也可以**学得越多越快越好**。大多数人之所以并非如此,不是因为大脑越老越差,而是因为他们从一开始就没有积累,仅此而已。
大脑**按需学习**的倾向,有时会阻止我们的学习 —— 因为在一个技能真正练好之前,大脑可能很难相信它的作用,这是很普遍的现象。但,大脑的**循环利用**机制,却总是在奖励学习,因为这个机制的存在,使得 “无论学什么最终都有用”,反正一切都是连接,一切都是网络,到最后实际产生的现象和效果是,学得越多,学得越快,学得越好。
从结果上来看,循环利用机制其实是对**超额学习**的奖励。大多数人终生被按需学习所限制,只有少数人经过时间的考验之后被循环利用机制反复奖励。

View File

@@ -0,0 +1,15 @@
# 7. 短时间内足量重复
一切的学习,本质上来看,都是在创建新的连接,构建新的局域网 —— 这很是耗费能量,需要大量的化学反应和物力放电,需要糖和氧。
单个神经元,被神经胶质细胞支撑在特定的位置,原本可能与邻近的某个神经元之间相互绝缘。但,相邻的两个神经元可能因为什么原因长出更多的突触,而那些突触可以慢慢延伸,直至两个神经元的突触连接在一起,形成可供电流通过的通路 —— 连接!这个过程不仅难度高,要耗费大量的能量,并且耗费的时间弄不好也很长。
创建新连接,构建新局域网,对大脑来说,最划算的办法就是**短时间内足量重复**。凡事都一样,刚开始可能不会做,开始做的时候很笨拙,但,做得多了也就熟练了。可问题在于,做得多,有两种方式,在很长时间里重复相同的数量,在很短的时间里重复相同的数量 —— 显然,后者更划算,这不仅事关**效率**,更关键的**效果**。
专业的弦乐演奏者都会 “轮指” —— 几个手指以均匀的节奏但以极快的速度地拨动琴弦…… 这显然很有难度,因为最终绝大多数人的手指做不出这样的动作。其实,任何人都能做到,大约一天三个小时差不多一个月多一点就可以练成。可是,如果每天 5 分钟,练上 1200 天行不行呢?估计不行 —— 更重要的是,虽然每天只练 5 分钟好像很容易,但,连续练 1200 天却可能难到不可能的地步。同样差不多 100 小时的练习,在越短的天数里越集中地完成,不仅效率更高,效果也越好。
这个现象的根源在于,你在耗时费力练习的同时,大脑在默默地执行**用进废退**。把时间拉得太长,频率搞得太低,重复次数太少,会使大脑自动降低此项活动的重要性,不认为它是必要的,不认为它是必需的,于是,无形之中形成了一个越来越大的阻力。
另外,人们普遍对**足量**有严重的误解。小朋友从开始尝试到能够吐字清晰地喊妈妈,需要 尝试的次数,不是十次八次,不是几十次,不是几百次,而是至少 5,000 次以上**。知道**只需要见识一次就可以,可是**做到**却需要大脑新建连接新建网络,这不只需要时间,更需要的是重复,并且还是远超大多数人误以为的重复次数。
有意义的学习,往往是复杂且又系统的,我们都知道心急不得,不应该急于求成。但,所有细节上的专项**练习**,最好是专项**集训**,重复数量要足够多,重复频率要足够高足够密,即,**短时间内足量重复** —— 这也是我对所谓**努力**的定义。

View File

@@ -0,0 +1,21 @@
# 8. 新旧网络间的竞争
当我们需要完成一项任务的时候,大脑会检索整个网络内的所有局域网,无论是高级功能局域网,还是基础功能局域网,调用必要的局域网进行组合发挥作用,进而完成任务。
如果完全找不到,那就只能去学了…… 得去新建连接,新建局域网。
这本来并不难,因为大脑从始至终都在做这样的事情,也擅长干这样的事情…… 但,它更擅长干的是另外一件事,还是出自于对节能的渴望和痴迷,它会借用**近似连接**或者**近似网络**,不顾一切地完成任务…… 但准确地说,那不是**完成任务**,而是**近似地完成任务**。
为什么?它就是想节能,它就是会不择手段地节能。
一项任务如此倒也常常看不出什么…… 但,很多任务都如此就完蛋了,这就好像 $0.8^5 \approx 0.327$ 或者 $0.7^{10} \approx 0.028$ 一样…… 并且,众多任务组合的时候,若是最重要的任务差一点剩下的就往往全都白费了。所以,这种**近似调用**以及**近似完成**的危害就极为可怕。
调用近似连接、近似网络,近似完成任务,是一种越来越强大的习惯,当它强大到一定地步的时候,就会变成彻底下意识的习惯,自己完全意识不到,并且常常伴随着洋洋自得。
这就是绝大多数人的感受是,随着岁数的增加,学习变得越来越困难。并不是因为新建连接新建局域网的难度增加了 —— 事实上,应该是越来越容易才对,因为从另外一个层面来看,还有过去建立了现在暂时用不上的连接和局域网能循环利用呢。而是因为旧的近似连接近似局域网的竞争力太大了,并且,在不知不觉中,它们的竞争力还被培养得越来越大。
人们绝大多在数学习效果上的差异,恨不得 99.99%,其实全都来自于这一个小小的细节,而不是人们通常误以为的所谓天分或者聪明:
> **能否甄别自己是否正在调用近似连接近似网络?**
只要能够甄别就能通过努力短时间内足量重复去新建连接新建网络。但如果不能甄别一切就无从谈起。关键在于这个甄别的动作99% 的情况下只能靠自己,并且,越是靠自己,那甄别能力就会越来越强。

View File

@@ -0,0 +1,29 @@
# 9. 注意不到就不存在
人们可以意识到自己正在思考,可以检查自己思考的过程,还可以判断自己的思考质量,关于思考的思考,有个专门的名词,元认知(*metarecognition*)。
元认知的存在与启动,本质上来看是注意力管理(*attention management*)—— 当你想办法关注自己的思考及其过程的时候,元认知就启动了。这就是注意力的神奇之处,它是大脑天生自带的神奇功能,它也决定了一个神奇的现象:
> **你注意不到的东西对你来说就不存在**。
展现在我们所在的现实世界总是丰富多彩,但,我们的注意力被手中那一百平方厘米不到的屏幕说吸引之后,新鲜空气,灿烂阳光,蓝天白云,小鸟飞舞,人来人往,欢声笑语…… 这一切都会瞬间消失,我们身处的变成了虚拟世界。
注意不到就不存在。
反过来也一样,不知道就注意不到。
你不知道这个原理,你不知道大脑最擅长干的就是调用近似网络,近似地完成任务,那么,你就注意不到自己正在调用近似网络,你就不知道你自己正在那么干,你也不会知道你的所谓完成只不过是近似完成,当你最终把复杂任务搞砸了的时候,你只是一脸问号,脑子里根本就没有答案。
科学家们提出了一个极为重要的概念:刻意练习。按照他们一致的说法,刻意练习的关键在于**不断提高练习的难度****不断突破舒适区**,否则,更多的练习不仅不会带来进步,还会导致一定的退步。
练习就要**努力**,即,**短时间内足量重复**。那么刻意练习呢?关键在于哪里?我觉得:
> **刻意练习关键在于,在练习的过程中要有组织有计划有系统地调用并集中自己的注意力,致力于新建连接新建网络,而不是调用近似连接近似网络**。
这个说法的好处是,因为更加具体,所以更具备可操作性,更有指导意义。
无论学什么,无论做什么,哪怕在起点上,就可以为目标制定一个 “**检查列表**”,罗列学好做好的关键衡量指标…… 这个列表就是启动元认知的关键,就是调用并集中注意力的目标。所以,别管学没学会,别管练没练好,要事先把这个列表烂熟于心,这样才能越来越轻松地调用注意力去关注、纠正、改良,直至成功验收。
人们总以为这是老师要干的事情,而自己是学生,所以理直气壮地把这项最基础最关键的人物完全交给老师或者教练…… 想想看吧,这是不是又一个绝大多数人最终失败的重要原因?
##

View File

@@ -0,0 +1,19 @@
# 10. 熟练就是卸载负担
大脑里的一切都存在于网络之中,每个任务都会被拆分成很多子任务,而后经过大脑对流程的自动优化,尽快完成。毫无疑问,大脑肯定是多线程工作的,不然就会被拖死。
可问题在于,注意力更多情况下是单线程的。它常常一次只能注意一个东西,如果有多个需要注意,那么它就得挨个来…… 有时候它也可能同时注意两个甚至三个东西(更多肯定不行了),但,只要其中一个足够突出,其它的就会瞬间沉入背景。
看看 1970 年认知心理学先驱尤里克·奈瑟Ulric Neisser的实验就知道了。一群人在舞台上传球观看者被要求对传球的次数计数…… 在这个过程中有个打扮成大猩猩的人出现在舞台,做了几个夸张的动作,才走下去 —— 结果,所有人都没看到那只大猩猩,因为大家的注意力都被引导到那只传来传去的球上了。
当我们系的一个新技能的时候,它可能需要我们完成多个任务,并且多个任务之间还可能需要相互协调。比如,蛙泳,这个对初学者相对最友好的游泳姿势。它需要起码三个动作的协调,上臂的动作,下肢的动作,用嘴巴呼吸的动作。这时候,我们的大脑就会忙不过来,因为关注这个的时候,就顾不上那个,关注那个的时候,又忘了这个……
我们逐个练,然后再尝试组合其中的两个 —— 这需要很长时间…… 直至熟练之后,再尝试组合所有动作 —— 这还需要很长时间…… 终于能熟练组合这三个动作了之后呢?就能游得很好很快吗?显然并非如此。这时候才发现,还有更多的细节需要注意,每个细节的微调都可能需要很多的时间。
幸运的是,这时候我们已经有余力注意那些细节了 —— 但,更准确的说法是,**熟悉就是卸载负担**。但,熟练不是尽头,因为 **精通就是无负担**
当我们对一个流程足够熟悉之后(当然是通过短时间内足量重复),还需要大量的重复(当然还是通过短时间内足量重复)…… 终于,完成这个流程就可以下意识完成甚至无意识完成了,不用再像最初那样,要记住步骤,注意衔接,核实质量…… 于是,我们那几乎只能**单线程**的注意力就相当于把这一部分负担彻底卸载掉了,同时需要做别的事情的时候,就会感觉轻松自如。
虽然我们的注意力几乎只能**单线程**工作,可实际上,这世界所有最重要的活动,本质上来看都是**多线程**的。
天下最大的技巧,只有少数人最终能掌握的所谓神技,本质上来看,其实都一样,都只不过是把多线程中的每一个线程都逐步通过大量的重复将其变成下意识甚至无意识即可完成的工作。就好像电脑上的现代操作系统那样,**把大量的线程彻底变成后台任务**。

View File

@@ -0,0 +1,13 @@
# 11. 被关注是最大负担
有一个心理学名词,叫做聚光灯效应(*spotlight effect*)。如果你突然意识到所有人都在盯着你的走路姿势看的话,突然之间,你竟然有可能干脆不会走路了……
因为被关注,还同时被那么多人关注,你的大脑突然紧张起来,它希望自己不出任何错,每个细节都能做好…… 突然之间,那几乎只能单线程工作的注意力被多方同时瓜分,哪儿哪儿都不够用,于是,大脑彻底失去了对肢体的支配能力。它不是从此之后就再不能支配了,而是在这种情况下突然做不到了而已……
日常生活中,随处可见的聚光灯效应最多发生在比较过程中。当人们发现自己做得不如他人好的时候,会产生自己的差正在被所有人看到的错觉。大脑最怕死,社死可能是最可怕的死法 —— 天下最令人恐慌的事情排名第一的,比真实死亡更靠前的,竟然是当众讲演。
比较其实可以分为两种。第一种是人们习以为常的,“拿自己的当前的状态和他人当前的状态相互比较”。这种**横向比较**比较的缺陷在于,忽视了各自的当前状态其实是之前积累和改良的结果。一旦比较失败,就失去了动力,养成了习惯的话,就会形成 “固守型人格”(*fixed mindset* —— 只做自己认为自己可以做好的事情…… 问题在于,自己能做好的事情并不多。并且,做得更好,除了要练得更多之外,从大脑结构来看,更依赖学得更多,大脑里没有孤岛,任何一个看起来毫不相干局域网其实都有可能发挥意想不到的作用。但,横向比较经常失败的结果只能是固步自封。
真正有意义的比较,其实是 “拿自己当前的状态和自己过去的状态进行比较”。通过这种**纵向比较**,首先它无法让你忽视这期间努力的存在,更重要的是它让你清楚地感受到努力的作用。这个习惯会养成 “进取型人格”(*growth mindset*)。因为反复经历过从笨拙走到熟练的过程,不仅更加自信,也可以更加轻松地专注于自我修炼。与此同时,越发地不在意也没时间进行无谓的**横向比较**。所谓 “心无旁骛”,最大的 “骛” 可能就是很想比较了。
有趣的是,越差的人求关注的欲望越强烈。越强的人越低调,其原因并非来自道德感,而是真的没时间,更是舍不得把宝贵的注意力花在其它地方。

View File

@@ -0,0 +1,17 @@
# 12. 有限排它不可再生
注意力是相当有限且又排它甚至还不可再生的资源。钱可以攒,时间可以省,但注意力这个东西,攒不下来的同时也省不下。
注意力高度集中,对大脑来说是一项超级耗能的活动,因为它意味着大脑需要调动多个区域且相互之间要高度协同,集中的化学反应,集中的物理放电 —— 需要不断补充糖和氧。但,人的整体体力有限,也就决定了注意力的上限。
从印刷术普及开始,到电子媒介的兴起,再到互联网吞噬整个世界,媒体统治了世界。我们的注意力被各路人马争夺,变成了极为稀缺的资源。连整个经济系统,都变得将其称呼为 “注意力经济” 比将其称呼为 “商品经济” 更为恰当。
移动互联网 2010 年前后崛起仅仅十年不到的时间里就大幅度降低了整个人类的注意广度Attention Span有统计调查表明现在的人普遍的注意广度不超过 1.92 分钟,他们在一整天 16 个小时的清醒时间里,拿起手机至少 500 次……
2 分钟不到的注意广度,无法完成任何有意义的学习,更不用提学习之后那更为重要的练习了。一般来说,注意力集中时长不超过 25 分钟左右就实际上聊胜于无 —— 否则,对大脑来说,新建连接就是不可能的,更别提什么新建网络了。可实际上,学习任何新技能,在一天的时间里可能需要 5 10 个甚至更多的注意力集中的 25 分钟。
人类的大脑进化了几十万年才成为今天的样子。大脑的超级可塑性,原本是这几十万年里进化的绝对优势。突然之间,在智能设备成为新的人体器官,媒体统治的注意力经济时代,大脑可塑性变成了极其危险的功能,它可以被塑造得多好,那么,更大程度上,它就可以被破坏得多狠。
只不过是十年时间,相对于几十万年的历史,这真是转瞬之间,白马尚未来得及过隙,一代青少年中绝大多大脑的大脑皮层就已经成了废墟。也许我们可以重建,但,哪怕拆除并清理那些废墟就有可能耗尽所有的资源…… 非常无奈。
保护自己的注意力,注定是下一代人最核心的生存技能 —— 只可惜,绝大多数人并不知道,所以也不在意。

View File

@@ -0,0 +1,13 @@
## 13. 一切都是化学反应
一切的念头,无论是基础的想法,还是高级的决策,甚至无法说明的各种情绪,其实都是大脑这个物理上存在的器官里分泌的化学物质之间发生的化学反应…… 于是,很多时候,很多念头其实相当随机,并且转瞬即逝。
当我们从梦中醒来,如果保持原来的姿势闭上眼继续睡过去,那么就很有可能回到原来的梦境(或者起码是类似的梦境)—— 可如果换了姿势就回不去了。这是因为换姿势会使大脑里的各种化学物质改变位置……
日常生活中,当我们的脑子里闯入令我们不适的念头时,我们会下意识地使劲**晃晃脑袋**,希望能够摆脱它 —— 这一点都不荒唐,因为这样的动作真的能起作用,因为大脑里的化学物质,哪怕是细微的位置上的变化,也可能导致很不一样的化学反应…… 于是,晃晃脑袋,化学反应变了,念头真有可能变,或者真有可能消失。
同样的道理,当我们紧张时,需要大口深呼吸 —— 也可以解释为大脑内部化学反应突然变得相对过于剧烈,于是需要大量的能量补充,氧和糖,否则就无法继续正常工作。
化学反应可能随机且并不稳定,所以,**跟着感觉走**其实非常可怕。这就是为什么我们要习惯于认真审视我们自身每个念头的根本原因了。我们不希望也不可能过于随机且过于不稳定地生活。我们挣扎着寻找方向并保持方向,就是为了摆脱随机,寻求稳定。
大脑内的各种化学反应,主要结果就是不同的神经元之间的物理放电,使它们相互连接,相互通讯,最终以某种方式协调各个身体器官。某一系列化学反应及其对应的念头,如果反复发生的话,就会被强化,直至物理器官形成固定的工作流程。事实上,人们有太多未经自我审核的念头和与之相应的习惯。

View File

@@ -0,0 +1,15 @@
## 14. 安全阈值决定成果
之前我们提到过,大脑 “痴迷于节能”,我们也提到过 “大脑最怕死” —— 之所以如此,就是大脑要保障整个身体的安全,毕竟,大脑是必须被其它器官支撑才有意义的器官。
所以,大脑不会允许你超负荷工作。正如汽车发动机若是发挥其 100% 效能的话,它工作不了多久就有可能报废。所以,工程师会为发动机设定一个安全阈值,比如,能启用的最大功率是实际最高功率的 70%…… 这样才能保证安全,还能保持长期稳定。
这也是为什么大脑在严格执行用进废退机制之后永远只倾向于 “按需学习” 的原因,从本能上来看,它不会选择超额学习。超额学习,某种意义上也是一种习得的技能,它是不小心尝到甜头之后才能启动的新直觉。
通过几十万年的基因遗传积累下来的进化成果并不适应这个知识爆炸的时代。大脑内部是一个有神经元构成的比银河系还要复杂不知道多少倍的网络,知识是更为无垠且不断扩张的网络。整个世界随时都在发生着变化,趋势一直就是变化越来越快,变化越来越大。说实话,大脑很难太适应这些变化,更不适应这样的变化速度。
最不适应的,可能就是那些大脑默认的安全阈值。过去的几十万年里,生存一直是问题,所以,大脑要不顾一切地先保障生存。突然之间,生存不是问题了,生活环境超级安全,生活必需的成本越来越低…… 在这种情况下,遵循一切大脑以几十万年的经验而设定的安全阈值,那就只能是所谓的彻底躺平,什么都不用干才对。一日两三餐,每餐一杯牛奶两个鸡蛋半个苹果就已经足够生存。
所以,日常生活中,你能发挥的并不是你真正的潜力,而是你的大脑为你设定的一个安全阈值之下能够发挥的所有能力。随着生存变得越来越容易,大脑为自己设定的安全阈值也就越来越低。可人的潜力究竟有多大呢?没办法精准测量。但,肯定比自己以为的大很多。
到底要不要想办法调整自己大脑所设定的安全阈值呢?这是个好问题。

30
1000-hours/index.md Normal file
View File

@@ -0,0 +1,30 @@
---
# https://vitepress.dev/reference/default-theme-home-page
layout: home
hero:
name: "一千小时"
text: "用你的注意力填满一千小时就能练成任何你所需要的技能……"
# text: "做到就是往 1000 小时里倾注自己的注意力……"
tagline: 所谓<strong>努力</strong>无非就是<strong>短时间内足量重复</strong>。 — 李笑来
actions:
- theme: brand
text: 简要说明
link: /intro
- theme: brand
text: 训练任务
link: /training-tasks/kick-off
- theme: brand
text: 语音塑造
link: /sounds-of-english/01-basics
- theme: brand
text: 大脑内部
link: /in-the-brain/01-inifinite
- theme: brand
text: 自我训练
link: /self-training/00-intro
# - theme: alt
# text: API Examples
# link: /api-examples

81
1000-hours/intro.md Normal file
View File

@@ -0,0 +1,81 @@
# 简要说明
原本只需要一句话就可以彻底说明白:
> **用你的注意力填满 1000 小时就能练成任何你所需要的技能**……
但是,仍然有必要做进一步详细一点的阐述。
“**用你的注意力**” 的意思是说,你只能靠自己,谁都一样,只要是真正有用的能力,到最后只能通过自学。往时间里倾注的是谁的注意力,那长出来的能力就只能是谁的 —— 所以,在学习这件事儿上,别人永远使不上劲,哪怕是为了你甚至不惜付出性命的父母。
“**1000 小时**” 看起来并不多,也的确不多。但,它有密度要求。每天 1 小时需要大约 3 年才能凑足 1000 小时;而每天 3 小时只需要 1 年就能攒足…… 首先,后者的效果比前者高出不知道多少倍,其次,前者实际上更难做到更难坚持。所以,做不到**每天至少 3 小时**,还不如不做。
“**就能**” 的意思是说没有例外。“用你的注意力填满 1000 小时” 是 “练成任何你所需要的技能” 的充分必要条件。若是充分必要条件被满足的话,结果就只能如实发生。
“**练成**”,不是从书本上 “知道” 或者在哪里 “学到”,不是考试 “及格” 或者 “优秀”,甚至不只是 “做好”,而是 “**精通**” —— 从来少有人做到。
“**你所需要的技能**” —— 不是你真正需要的,你就学不好练不会。在这一点上,你非常有经验。就算真正需要,你自己却看不出来,或者暂时感受不到,那么,你还是学不好练不会,起码暂时学不好练不会。你更有经验的是,虽然人生最需要的技能其实并没有多少,但几乎都一样,你在认同的确需要它的同时却从来没有把它做好过,更别说**精通**了…… 当然,绝大多数人和你一样,就那么凑合着活了一辈子。
“**任何**” 的意思是说,虽然,我们选择**英语**作为**健脑**的**示范训练标的**,但是,你其实可以用同样的方式去掌握**任何**你所需要的技能。
我们把英语作为示范训练标的倒没问题,可当你听说目标是 “**用一年时间把英语练成第一语言**” 的时候,估计你会多少有点震惊,不敢相信,甚至,可能会因为不相信而产生鄙视或者厌恶的情绪。虽然这很正常,但,我有必要冒着被你更讨厌的风险提醒你,却也没必要便进一步深入展开的是,你所鄙视或者厌恶的,相对来看,其实更可能是你自己 —— 因为这个目标本身无论如何也害不着你。
选择英语作为**健脑**的示范标的有很多原因。
最直接的的原因当然是因为英语真的有用,毕竟人类的绝大多数知识与智慧就是用英语记录并传播的。另外一个原因是对母语非英语的人来说,英语熟练直接意味着收入相对更高,这一点有无数的统计数据支持。
然而,最重要的原因在于,**掌握并不断提高自然语言使用能力**,是最佳的**健脑**方式 —— 完全没必要在这个陈述之后再附加上 “之一”,因为它就是最佳健脑方式**。自然语言**是人类终其一生可以遇到的最复杂最系统的知识,一切其它的知识技能都建立在其基础之上,无论是学也好还是练也罢,没有止境。也因此,所有人都可以,事实上也应该,终其一生去培养并发展对自然语言的驾驭能力。
并且,在**英语**练习中,我们的选择之一是最为基础的**语音塑造**(另外一个是**记忆扩展**);核心原因在于,这是典型的**知道学到并不一定做到**的知识,**做到**只能靠**短时间内足量重复**的训练方式 —— 背后是**大脑**内部**神经元**之间**新建连接新建网络**。
也是出于同样的原因,**这场训练实际上适用于任何人**,不分性别、年龄、种族或者国籍。即便你的母语是英语,也可以通过使用同样的方法训练自己学习另外一种语言作为健脑方式。自然语言训练之于健脑,正如跑步之于健身。
这场训练虽然以**英语**为示范训练标的,但,在其过程中,你的**母语**水平会只能会水涨船高。虽然,你的第二语言水平**必然**受到第一语言的**限制**。但是,反过来,在你通过努力把原本的第二语言练成第一语言的过程中,你原本的第一语言只能比原来更强。新的语言会**反哺**之前已经掌握的语言。
这场训练会直接改变你的**大脑结构**。完成这场训练的过程中,你的大脑内部,**灰质密度**会变得越来越高,**灰质体积**会变得越来越大,**白质覆盖面积**也会越来越大。如果用 fMRI 设备扫描,那么,这一切对你来说都应该是肉眼可见的变化。
如此这般的大脑结构变化,对一个人产生的影响,绝不仅仅是多掌握了一门外语或者提高了自然语言使用能力那么简单,它带来的变化非常普遍且又深远。
更高的灰质密度,更大的灰质体积,更大的白质覆盖面积 —— 打个比方,这就好像是你为自己的大脑升级了硬件,更快的 CPU更大的内存更高的带宽…… 于是,你的大脑无论干什么都更高效。无论学什么都更快更好,于是只能越学越多,进入**良性循环****学得越多越快越好**。
虽然绝大多数人并不健身,但也不会否认健身的好处和必要性。可实际上,**健脑比健身更重要** —— 只要稍微动脑想一下就知道这完全不可辩驳。至于要不要健脑,和要不要健身一样,虽然完全是个人选择,但的确有必要提醒:绝对不能像健身房里的绝大多数人那样,到了身体坏掉才想起来健身 —— 若是脑子坏掉了再去健脑,那就彻底来不及了吧?
对了,健脑改变大脑结构,更高的灰质密度,更大的灰质体积,更大的白质覆盖面积,可以有效预防各种老年脑疾病,比如帕金森综合症。与此同时,更高的灰质密度,更大的灰质体积,更大的白质覆盖面积,还可以抗抑郁……
这场训练的意义绝不可能仅限于此。
对孩子来说,这是他们真正**学会学习**的机会。科技不断进步的结果导致人们的生存难度越来越低,学习的必要性实际上随之越来越少。然而,如果除了活着之外还想活得好一些,更好一些,那么就只能通过**学习**去**争取** —— 当然,我们会反复证明,实际上只能通过**自学**。显然,更强大的大脑自然会保证更好的生活。
没有父母不在意孩子的**在校考试成绩**。其实,对大脑来说,无论学什么,到最后对它来讲都是**体育课** —— 反正都是健脑,反正都是神经元之间新建连接新建网络。与此同时,本质上来看,学校里的一切课程都是**语文课**。科学虽然更多使用**人工语言**,但人工语言毕竟只是自然语言的一个子集。所以,自然语言驾驭能力的提高必然会促进任何学科的考试成绩。千万不要怀疑这点,否则耽误成绩。
对父母来说,孩子的学习潜力和能力的增加,最实际最直接的结果,当然是教育费用的大幅降低。不仅**少花钱**,还**少操心**。更为重要的是,作为父母,完成这场训练,一定能因此获得子女的**尊重** —— 对父母来说,有什么比这个更重要更实用的呢?
无论尊重来自于哪里,都会潜移默化地影响一个人的容貌。尊重只能是成绩的结果,是赢来的态度,是自信的根本。尊重真的美容。有人曾经说,人要为自己 40 岁之后的长相负责,从这个角度看非常有道理。专注的眼神、从容的行事、平和的姿态…… 其实都来自于已经完全不一样的大脑结构。从这个意义上来讲,这场训练完全是字面意义上的 “**改头换面**”。
这场训练对父母来说,更大的意义在于,任何正常人完整经历之后,都会对当下的**教育体制** —— 我说的是**全球范围**内的教育体制 —— 产生与之前完全不一样的**看法**,自然会因此有不一样的**判断**…… 当然会导致很多不一样的**决策**,最终影响的不仅是自己或者孩子的**方向**,甚至可能是整个**家族命运**。
最后必须提及的是,这场健脑训练同时是**注意力**训练,也是**判断力**训练。
**注意力**是一切**生产力**的来源与保障。到最后,一个人的**能力**完全取决于他**驾驭自己注意力的能力**。人与人之间的核心差异只有这一项,看他到底能把自己的注意力集中多久,看他知不知道应该把自己的注意力集中到哪里…… 其它绝大多数差异,最终都是这项差异的结果。
知道应该把自己的注意力集中到哪里,需要的是**判断力**。判断力不是与生俱来的,与生俱来的只有求生的欲望。判断力只能学出来练出来。早期的判断力仅凭直觉,并不够用,所以需要父母辅助、培养、塑造…… 但,终究要靠自己发展。学得越多,判断力越强;判断力越强,学得越多越快越好。人并不是到了特定的岁数就会自动成熟。巨婴无所不在,他们普遍且又一致的特征就是极度缺乏判断力。
**判断力是一切智慧的基础和结果**。智慧要么越来越多,否则就愚蠢越来越多;判断力要么越来越强,要么越来越差 —— 这其中的 “贫富差距” 从来都是天壤之别。若是借用 “**基尼系数**”[^*] 去描述的话,人群之中判断力的基尼系数远远大于 0相当接近于 1在这件事上没有公平分配。
2021 年前后,**人工智能**的爆发,把我们瞬间从**信息时代**拖进了**智能时代**。智能时代里,个体最大的竞争力是什么?只能是**判断力**。有判断力的人有机会把人工智能当作自己进一步更加快速发展的工具,而没有判断力的人会把人工智能当作自己偷懒糊弄他人的工具。人工智能已经同时成为人们持续上进或者甘于沉沦的理由;一小部分人会高歌猛进,绝大多数人会欢乐地沉沦。
在我看来,这不可能只是一场自我训练。
AI 凶猛。未来咆哮而至。关于人工智能对人类的威胁,以及对各行各业的影响,尤其是对失业的恐惧,人们讨论得太多。我看到的却更多是**希望**,我们可以奔赴。突然之间,人工智能有可能帮我们解决掉我们那长久无法摆脱的**眼高手低**之尴尬,因此我们当然有可能会因人工智能而变得更为强大。然而,天大的希望背后的确也紧跟着**危机**和**陷阱**,我们也需要像逃亡一样拼命。一不小心就有可能因为人工智能降智,一不小心就有可能因为自己松懈而被时代抛弃。
—— 吾往矣。
<span style="text-align: right;">**李笑来** *2024* 春节 于 北京</span>
[^*]: 基尼系数Gini coefficient是 20 世纪初意大利学者科拉多·基尼根据洛伦兹曲线所定义的判断年收入分配公平程度的指标,是比例数值,在 0 和 1 之间。基尼系数越小,年收入分配越平均;基尼系数越大,年收入分配越不平均。。

22
1000-hours/package.json Normal file
View File

@@ -0,0 +1,22 @@
{
"private": true,
"name": "1000-hours",
"devDependencies": {
"markdown-it-footnote": "^4.0.0",
"markdown-it-ins": "^4.0.0",
"markdown-it-mark": "^4.0.0",
"markdown-it-mathjax3": "^4.3.2",
"markdown-it-sub": "^2.0.0",
"markdown-it-sup": "^2.0.0",
"mermaid": "^10.8.0",
"sass": "^1.70.0",
"vitepress": "^1.0.0-rc.42",
"vitepress-plugin-mermaid": "^2.0.16",
"vue": "^3.4.18"
},
"scripts": {
"dev": "vitepress dev",
"build": "vitepress build",
"preview": "vitepress preview"
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More