Easy Vibe Coding 学习心得(五):综合实战——我的 AI 原生应用上线了
Easy Vibe Coding 学习心得(五):综合实战——我的 AI 原生应用上线了
一、从"学习"到"实战"——身份的蜕变
1.1 前四篇的回顾
过去两个月,我完成了系统性的 Vibe Coding 学习:
- 第一篇:60 秒做出第一个贪吃蛇游戏,并改造为 AI 原生应用
- 第二篇:电商素材工作台,完整的产品原型
- 第三篇:前端之美,霍格沃茨魔法画像
- 第四篇:后端之力,AI 博客生成器全栈实现
每一步都在成长,但总觉得还缺了什么。
1.2 新的目标
直到有一天,我问自己:
“我学了这么多,能不能做出一个真正上线、有人用的产品?”
不是 DEMO,不是原型,而是:
- 有真实用户
- 有实际价值
- 能持续运营
带着这个目标,我开始了 Stage 3 的毕业设计——综合实战项目。
二、项目选题:从"练手"到"产品"
2.1 选题的三个标准
教程里提到,好的实战项目应该满足:
1. 有真实需求
- 不是"为了做而做"
- 确实能解决某个问题
- 有人愿意用
2. 有技术挑战
- 能用到学过的技术
- 有一定难度但能完成
- 做完能写进简历
3. 有扩展空间
- 可以持续迭代
- 有商业化可能
- 能做成副业
2.2 我的选题过程
我列出了几个想法:
| 想法 | 需求 | 技术 | 扩展 | 总分 |
|---|---|---|---|---|
| AI 写作助手 | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | 10 |
| 智能客服系统 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 12 |
| AI 学习伴侣 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 15 |
| 电商素材工具 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | 9 |
最终选择:AI 学习伴侣
原因:
- 我自己就是学习者,懂用户痛点
- 技术栈全面(前端 + 后端+AI)
- 可以持续迭代,有商业化空间
2.3 需求分析
目标用户:
- 自学编程的初学者
- 需要提升技能的职场人
- 准备面试的求职者
核心痛点:
- 学习资源太多,不知道从哪里开始
- 遇到问题没人解答,容易放弃
- 学了就忘,缺乏复习机制
- 没有学习伙伴,缺乏动力
解决方案:
- AI 生成个性化学习路径
- 24/7 在线答疑
- 智能复习提醒
- 学习社区和排行榜
三、产品设计:从"功能"到"体验"
3.1 产品定位
产品名称: LearnMate AI
Slogan: 你的专属 AI 学习伴侣
核心价值:
- 个性化学习路径
- 即时答疑解惑
- 智能复习提醒
- 学习社区互动
3.2 功能设计
MVP 功能(第一版):
- 用户注册登录
- 选择学习方向(前端/后端/AI/数据科学)
- AI 生成学习路径
- 每日学习任务
- AI 答疑助手
V2 功能(第二版):
- 学习进度追踪
- 智能复习提醒
- 学习社区
- 成就系统
V3 功能(第三版):
- 一对一 AI 模拟面试
- 简历优化建议
- 职位推荐
- 付费会员
3.3 技术架构
┌─────────────────────────────────────────────┐
│ 前端层 │
│ Vue 3 + Element Plus + Tailwind CSS │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 后端层 │
│ Supabase (Database + Auth + Storage) │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ AI 服务层 │
│ DeepSeek (文本) + SiliconFlow (图像) │
│ Dify (Agent 工作流) │
└─────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 部署层 │
│ Zeabur (前端托管 + Edge Functions) │
└─────────────────────────────────────────────┘
四、开发实战:从 0 到 1 上线
4.1 项目初始化
第一步:创建项目
npm create vue@latest learn-mate-ai
cd learn-mate-ai
npm install
# 安装依赖
npm install @supabase/supabase-js element-plus tailwindcss
npm install vue-router pinia @element-plus/icons-vue
第二步:配置 Supabase
-- 创建学习路径表
CREATE TABLE learning_paths (
id BIGSERIAL PRIMARY KEY,
user_id UUID REFERENCES auth.users(id),
direction VARCHAR(50) NOT NULL, -- frontend/backend/ai/data
level VARCHAR(20) NOT NULL, -- beginner/intermediate/advanced
goals TEXT[],
content JSONB,
progress INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- 创建每日任务表
CREATE TABLE daily_tasks (
id BIGSERIAL PRIMARY KEY,
user_id UUID REFERENCES auth.users(id),
path_id BIGINT REFERENCES learning_paths(id),
title VARCHAR(255) NOT NULL,
description TEXT,
content TEXT,
status VARCHAR(20) DEFAULT 'pending', -- pending/completed/skipped
due_date DATE NOT NULL,
completed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
-- 创建学习记录表
CREATE TABLE study_logs (
id BIGSERIAL PRIMARY KEY,
user_id UUID REFERENCES auth.users(id),
action VARCHAR(50) NOT NULL, -- login/complete_task/ask_question
details JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
-- 创建用户资料表
CREATE TABLE profiles (
id UUID REFERENCES auth.users PRIMARY KEY,
username VARCHAR(50) UNIQUE,
avatar_url TEXT,
bio TEXT,
learning_streak INTEGER DEFAULT 0,
total_points INTEGER DEFAULT 0,
created_at TIMESTAMP DEFAULT NOW()
);
-- 行级安全策略
ALTER TABLE learning_paths ENABLE ROW LEVEL SECURITY;
ALTER TABLE daily_tasks ENABLE ROW LEVEL SECURITY;
ALTER TABLE study_logs ENABLE ROW LEVEL SECURITY;
ALTER TABLE profiles ENABLE ROW LEVEL SECURITY;
-- 允许用户读取自己的数据
CREATE POLICY "用户可读自己的路径" ON learning_paths
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "用户可创建自己的路径" ON learning_paths
FOR INSERT WITH CHECK (auth.uid() = user_id);
CREATE POLICY "用户可读自己的任务" ON daily_tasks
FOR SELECT USING (auth.uid() = user_id);
CREATE POLICY "用户可更新自己的任务" ON daily_tasks
FOR UPDATE USING (auth.uid() = user_id);
4.2 核心功能实现
功能一:AI 生成学习路径
// composables/useLearningPath.js
import { ref } from 'vue'
import { supabase } from '../utils/supabase'
const DEEPSEEK_API_KEY = import.meta.env.VITE_DEEPSEEK_API_KEY
export function useLearningPath() {
const generating = ref(false)
const error = ref(null)
// 生成学习路径
async function generatePath(direction, level, goals) {
generating.value = true
error.value = null
try {
// 调用 AI 生成学习路径
const response = await fetch('https://api.deepseek.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${DEEPSEEK_API_KEY}`
},
body: JSON.stringify({
model: 'deepseek-chat',
messages: [
{
role: 'system',
content: `你是一位专业的学习规划师,擅长为不同水平的学习者制定个性化学习路径。
请根据用户提供的信息,生成一个详细的学习路径,包含:
1. 学习方向:${direction}
2. 当前水平:${level}
3. 学习目标:${goals.join(', ')}
返回格式要求(JSON):
{
"weeks": [
{
"week": 1,
"topic": "本周主题",
"objectives": ["目标 1", "目标 2"],
"resources": [
{"title": "资源名称", "type": "video|article|practice", "url": "链接"}
],
"tasks": [
{"title": "任务名称", "description": "任务描述", "estimatedHours": 2}
]
}
],
"tips": ["学习建议 1", "学习建议 2"]
}`
},
{
role: 'user',
content: `请为我制定一个${level}水平的${direction}学习路径,我的目标是:${goals.join('、')}。`
}
],
response_format: { type: 'json_object' }
})
})
const data = await response.json()
const pathContent = JSON.parse(data.choices[0].message.content)
// 保存到数据库
const { data: savedPath, error: saveError } = await supabase
.from('learning_paths')
.insert({
user_id: (await supabase.auth.getUser()).data.user.id,
direction,
level,
goals,
content: pathContent,
progress: 0
})
.select()
.single()
if (saveError) throw saveError
// 生成第一周的任务
await generateTasks(savedPath.id, pathContent.weeks[0])
return savedPath
} catch (err) {
error.value = err.message
return null
} finally {
generating.value = false
}
}
// 生成任务
async function generateTasks(pathId, weekData) {
const { data: { user } } = await supabase.auth.getUser()
const tasks = weekData.tasks.map((task, index) => ({
user_id: user.id,
path_id: pathId,
title: task.title,
description: task.description,
due_date: new Date(Date.now() + index * 24 * 60 * 60 * 1000).toISOString().split('T')[0]
}))
await supabase.from('daily_tasks').insert(tasks)
}
return {
generating,
error,
generatePath
}
}
功能二:AI 答疑助手
// composables/useAITutor.js
import { ref } from 'vue'
const DEEPSEEK_API_KEY = import.meta.env.VITE_DEEPSEEK_API_KEY
export function useAITutor() {
const chatting = ref(false)
const messages = ref([])
// 发送问题
async function askQuestion(question, context = {}) {
chatting.value = true
// 添加用户消息
messages.value.push({
role: 'user',
content: question,
timestamp: Date.now()
})
try {
// 构建系统提示词
const systemPrompt = buildSystemPrompt(context)
const response = await fetch('https://api.deepseek.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${DEEPSEEK_API_KEY}`
},
body: JSON.stringify({
model: 'deepseek-chat',
messages: [
{ role: 'system', content: systemPrompt },
...messages.value.slice(-10).map(m => ({
role: m.role,
content: m.content
}))
],
temperature: 0.7,
max_tokens: 1000
})
})
const data = await response.json()
const answer = data.choices[0].message.content
// 添加 AI 回复
messages.value.push({
role: 'assistant',
content: answer,
timestamp: Date.now()
})
// 记录学习日志
await logStudyAction('ask_question', { question, answer })
return answer
} catch (err) {
console.error('AI 答疑失败:', err)
messages.value.push({
role: 'system',
content: '抱歉,我现在有点累,请稍后再试。',
timestamp: Date.now()
})
return null
} finally {
chatting.value = false
}
}
// 构建系统提示词
function buildSystemPrompt(context) {
const { direction, level, currentTopic } = context
return `你是一位专业的 AI 学习导师,正在帮助学生学习${direction || '编程'}。
学生当前水平:${level || '初学者'}
当前学习主题:${currentTopic || '未指定'}
你的职责:
1. 用简单易懂的语言解释概念
2. 提供代码示例时,要详细注释
3. 引导学生思考,而不是直接给答案
4. 鼓励学生,保持积极的态度
5. 如果问题超出范围,诚实告知
回答风格:
- 亲切友好,像朋友一样交流
- 结构清晰,分点说明
- 适当使用 emoji,让对话更生动`
}
// 记录学习日志
async function logStudyAction(action, details) {
const { data: { user } } = await supabase.auth.getUser()
if (!user) return
await supabase.from('study_logs').insert({
user_id: user.id,
action,
details
})
}
return {
chatting,
messages,
askQuestion
}
}
功能三:学习进度追踪
// composables/useProgress.js
import { ref, computed } from 'vue'
import { supabase } from '../utils/supabase'
export function useProgress() {
const stats = ref({
streak: 0,
totalTasks: 0,
completedTasks: 0,
totalPoints: 0,
weeklyProgress: []
})
// 加载统计数据
async function loadStats() {
const { data: { user } } = await supabase.auth.getUser()
if (!user) return
// 获取用户资料
const { data: profile } = await supabase
.from('profiles')
.select('*')
.eq('id', user.id)
.single()
// 获取任务统计
const { data: tasks } = await supabase
.from('daily_tasks')
.select('status')
.eq('user_id', user.id)
// 获取周进度
const { data: weeklyData } = await supabase
.from('study_logs')
.select('created_at, action')
.gte('created_at', new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString())
stats.value = {
streak: profile?.learning_streak || 0,
totalTasks: tasks?.length || 0,
completedTasks: tasks?.filter(t => t.status === 'completed').length || 0,
totalPoints: profile?.total_points || 0,
weeklyProgress: calculateWeeklyProgress(weeklyData)
}
}
// 计算周进度
function calculateWeeklyProgress(logs) {
const days = ['日', '一', '二', '三', '四', '五', '六']
const progress = []
for (let i = 6; i >= 0; i--) {
const date = new Date(Date.now() - i * 24 * 60 * 60 * 1000)
const dateStr = date.toISOString().split('T')[0]
const count = logs?.filter(log =>
log.created_at.startsWith(dateStr)
).length || 0
progress.push({
day: days[date.getDay()],
date: dateStr,
count
})
}
return progress
}
// 完成任务
async function completeTask(taskId) {
const { data: { user } } = await supabase.auth.getUser()
const { error } = await supabase
.from('daily_tasks')
.update({
status: 'completed',
completed_at: new Date().toISOString()
})
.eq('id', taskId)
.eq('user_id', user.id)
if (error) throw error
// 增加积分
await supabase.rpc('add_points', {
user_id: user.id,
points: 10
})
// 记录日志
await supabase.from('study_logs').insert({
user_id: user.id,
action: 'complete_task',
details: { task_id: taskId }
})
await loadStats()
}
return {
stats,
loadStats,
completeTask
}
}
4.3 界面设计
首页设计:
<!-- views/Home.vue -->
<template>
<div class="home">
<!-- 欢迎区域 -->
<section class="hero">
<h1>🎯 你的专属 AI 学习伴侣</h1>
<p>个性化学习路径 · 即时答疑解惑 · 智能进度追踪</p>
<div class="cta-buttons">
<button class="btn-primary" @click="startLearning">
开始学习
</button>
<button class="btn-secondary" @click="watchDemo">
观看演示
</button>
</div>
</section>
<!-- 功能特性 -->
<section class="features">
<div class="feature-card">
<div class="icon">📚</div>
<h3>个性化学习路径</h3>
<p>AI 根据你的目标和水平,生成专属学习计划</p>
</div>
<div class="feature-card">
<div class="icon">🤖</div>
<h3>24/7 AI 答疑</h3>
<p>随时提问,即时解答,学习不再卡壳</p>
</div>
<div class="feature-card">
<div class="icon">📊</div>
<h3>智能进度追踪</h3>
<p>可视化学习数据,见证每一步成长</p>
</div>
<div class="feature-card">
<div class="icon">🏆</div>
<h3>成就系统</h3>
<p>完成任务获得积分,解锁各种成就</p>
</div>
</section>
<!-- 学习方向选择 -->
<section class="directions" v-if="currentUser">
<h2>选择你的学习方向</h2>
<div class="direction-grid">
<div
v-for="dir in directions"
:key="dir.id"
class="direction-card"
@click="selectDirection(dir)"
>
<div class="dir-icon">{{ dir.icon }}</div>
<h3>{{ dir.name }}</h3>
<p>{{ dir.description }}</p>
</div>
</div>
</section>
<!-- 学习统计 -->
<section class="stats-section" v-if="currentUser">
<h2>你的学习数据</h2>
<div class="stats-grid">
<div class="stat-card">
<div class="stat-value">{{ stats.streak }}</div>
<div class="stat-label">连续学习天数</div>
</div>
<div class="stat-card">
<div class="stat-value">{{ stats.completedTasks }}/{{ stats.totalTasks }}</div>
<div class="stat-label">完成任务</div>
</div>
<div class="stat-card">
<div class="stat-value">{{ stats.totalPoints }}</div>
<div class="stat-label">总积分</div>
</div>
</div>
</section>
</div>
</template>
<script setup>
import { computed } from 'vue'
import { useRouter } from 'vue-router'
import { useAuth } from '../composables/useAuth'
import { useProgress } from '../composables/useProgress'
const router = useRouter()
const { currentUser } = useAuth()
const { stats, loadStats } = useProgress()
const directions = [
{ id: 'frontend', icon: '🎨', name: '前端开发', description: 'Vue/React/HTML/CSS/JavaScript' },
{ id: 'backend', icon: '⚙️', name: '后端开发', description: 'Node.js/Python/Java/Go' },
{ id: 'ai', icon: '🤖', name: '人工智能', description: '机器学习/深度学习/大模型' },
{ id: 'data', icon: '📊', name: '数据科学', description: '数据分析/可视化/统计学' }
]
// 加载统计数据
loadStats()
function startLearning() {
if (!currentUser.value) {
router.push('/login')
} else {
router.push('/path')
}
}
function selectDirection(direction) {
router.push({
path: '/path/create',
query: { direction: direction.id }
})
}
</script>
<style scoped>
.home {
max-width: 1200px;
margin: 0 auto;
padding: 40px 20px;
}
.hero {
text-align: center;
padding: 60px 20px;
margin-bottom: 40px;
}
.hero h1 {
font-size: 2.5em;
margin-bottom: 15px;
background: linear-gradient(135deg, #667eea, #764ba2);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.hero p {
font-size: 1.2em;
color: #888;
margin-bottom: 30px;
}
.cta-buttons {
display: flex;
gap: 15px;
justify-content: center;
}
.btn-primary {
padding: 15px 40px;
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
border: none;
border-radius: 10px;
font-size: 1.1em;
cursor: pointer;
transition: all 0.3s ease;
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 5px 20px rgba(102, 126, 234, 0.4);
}
.btn-secondary {
padding: 15px 40px;
background: rgba(255, 255, 255, 0.1);
color: white;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 10px;
font-size: 1.1em;
cursor: pointer;
}
.features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 60px;
}
.feature-card {
background: rgba(255, 255, 255, 0.05);
padding: 30px;
border-radius: 15px;
text-align: center;
border: 1px solid rgba(255, 255, 255, 0.1);
transition: all 0.3s ease;
}
.feature-card:hover {
transform: translateY(-5px);
border-color: #667eea;
}
.feature-card .icon {
font-size: 3em;
margin-bottom: 15px;
}
.directions {
margin-bottom: 60px;
}
.directions h2 {
text-align: center;
margin-bottom: 30px;
}
.direction-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
.direction-card {
background: rgba(255, 255, 255, 0.05);
padding: 30px;
border-radius: 15px;
cursor: pointer;
transition: all 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.direction-card:hover {
background: rgba(102, 126, 234, 0.1);
border-color: #667eea;
}
.dir-icon {
font-size: 3em;
margin-bottom: 15px;
}
.stats-section {
margin-bottom: 40px;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
}
.stat-card {
background: rgba(255, 255, 255, 0.05);
padding: 30px;
border-radius: 15px;
text-align: center;
}
.stat-value {
font-size: 2.5em;
font-weight: bold;
color: #667eea;
margin-bottom: 10px;
}
.stat-label {
color: #888;
}
</style>
4.4 部署上线
第一步:配置环境变量
创建 .env.production 文件:
VITE_SUPABASE_URL=https://xxx.supabase.co
VITE_SUPABASE_ANON_KEY=eyJhbGc...
VITE_DEEPSEEK_API_KEY=sk-...
VITE_SILICONFLOW_API_KEY=sk-...
第二步:构建项目
npm run build
第三步:部署到 Zeabur
- 登录 Zeabur 控制台
- 创建新项目
- 选择 GitHub 仓库
- 配置环境变量
- 点击部署
第四步:配置域名
- 购买域名(可选)
- 在 Zeabur 添加自定义域名
- 配置 DNS 记录
第五步:测试验证
访问线上地址,测试所有功能:
- 用户注册登录 ✅
- 生成学习路径 ✅
- AI 答疑 ✅
- 任务完成 ✅
- 进度统计 ✅
五、上线后的数据
5.1 第一周数据
用户数据:
- 注册用户:52 人
- 日活跃用户:15-25 人
- 学习路径生成:38 次
- AI 答疑次数:200+ 次
技术数据:
- 平均响应时间:1.2 秒
- 页面加载时间:0.8 秒
- API 调用成功率:99.5%
- 数据库查询时间:<100ms
用户反馈:
“这个工具真的帮到我了!AI 生成的学习路径很清晰。”
“答疑功能很好用,比查 Stack Overflow 快多了。”
“希望能添加更多学习资源推荐。”
5.2 成本分析
月度成本:
| 项目 | 免费额度 | 实际使用 | 费用 |
|---|---|---|---|
| Supabase | 500MB 数据库 | 50MB | $0 |
| Zeabur | 100 万积分 | 30 万积分 | $0 |
| DeepSeek | - | 约 50 万次 token | ¥50 |
| 域名 | - | 1 个 | ¥60/年 |
总成本:约 ¥110/月(完全可以承受)
5.3 遇到的问题
问题一:并发请求过多
上线第一天,突然有 20 多人同时使用,AI API 调用失败率上升。
解决:
- 添加请求队列,限制并发数
- 添加重试机制
- 添加降级方案(使用缓存)
问题二:学习路径太长
AI 生成的学习路径有时长达 20 周,用户看了就放弃。
解决:
- 限制最大周数为 12 周
- 添加"快速入门"模式(4 周)
- 允许用户自定义学习时长
问题三:AI 回答不准确
有时 AI 的回答过于笼统,用户不满意。
解决:
- 优化系统提示词,添加更多上下文
- 添加反馈机制,用户可标记"有用/无用"
- 收集常见问题,建立知识库
六、关键收获
6.1 产品思维:从"功能"到"价值"
以前我只关注功能实现:
- “这个功能怎么做”
- “用什么技术”
现在我学会了思考价值:
- “这个功能解决了什么问题”
- “用户真的需要吗”
- “有没有更好的方案”
功能不等于价值,有价值的功能才是好功能。
6.2 数据思维:从"感觉"到"事实"
以前我判断产品好坏靠感觉:
- “我觉得这个功能好用”
- “用户应该会喜欢”
现在我学会了看数据:
- 日活跃用户数
- 功能使用率
- 用户留存率
数据不会说谎,用数据驱动决策。
6.3 运营思维:从"上线"到"增长"
以前我觉得上线就是结束:
- “终于做完了”
- “可以休息了”
现在我明白上线只是开始:
- 收集用户反馈
- 持续迭代优化
- 推广获客
产品上线不是终点,而是新的起点。
6.4 商业思维:从"项目"到"产品"
以前我做项目只为学习:
- “能写进简历就行”
- “有没有人用不重要”
现在我学会了商业思考:
- 目标用户是谁
- 如何获取用户
- 如何变现
好的项目可以变成好的产品,好的产品可以变成好的生意。
七、下一步计划
7.1 短期优化(1 个月内)
- 添加学习资源推荐(免费课程、书籍)
- 添加学习小组功能
- 优化移动端体验
- 添加微信小程序版本
7.2 中期规划(3 个月内)
- 推出付费会员(¥19/月)
- 添加一对一模拟面试
- 与招聘平台合作
- 目标:1000 付费用户
7.3 长期愿景(1 年内)
- 成为领先的 AI 学习平台
- 覆盖 10+ 学习方向
- 建立学习社区
- 目标:10 万用户,实现盈利
八、给学习者的建议
8.1 关于"开始"
很多人问我:“我也想做一个产品,但不知道从哪里开始。”
我的建议是:现在就动手。
不要等"准备好了",因为永远没有完全准备好的时候。
我的第一个项目也很烂,但它让我学到了很多。
完成比完美更重要。
8.2 关于"坚持"
做产品的过程中,会遇到很多困难:
- 技术难题
- 用户流失
- 动力不足
我的方法是:小步快跑。
不要想着一口气做完,而是每天进步一点点。
今天加一个功能,明天优化一个体验,后天修复一个 bug。
积小胜为大胜。
8.3 关于"成功"
什么是成功?
- 赚了很多钱?
- 有很多用户?
- 被大公司收购?
我的理解是:成功是成为更好的自己。
通过做产品,我学会了:
- 全栈开发
- 产品设计
- 用户运营
- 商业思考
这些能力,比产品本身更有价值。
过程比结果更重要。
下一篇:《学习心得(六):RAG 入门——让 AI 拥有企业级知识库》
⚠️ 免责声明:本文由 AI 智能体辅助创作,内容仅供参考。文中涉及的代码示例、技术方案请在实际应用前自行验证。观点仅代表作者个人,不构成任何形式的投资或技术决策建议。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)