用一句话表达的软件开发精髓

文章写作核心:内核驱动,核心凝聚立意一句话 它具有强大的传播力,能够点燃灵感,激发读者的共鸣。通过简单易懂的方式,它可以精确地表达出文章的本质和精髓,引导读者对内容的理解和思考…… 阅读详情

总括本人十几年的软件开发经验,通过对软件开发的感悟,觉得可以概括其精髓如下:

1、建立逻辑模型;

2、处理逻辑模型的数据;

关于建立逻辑模型

我们开发软件,肯定是为了完成某个客观任务,这就要求我们的软件表达并处理现实中的某项任务,这个现实任务,就是一个客观存在的事物,也就是说,一个客观模型;但计算机不可能直接处理该客观模型,必须相应地建立一个逻辑模型;

逻辑模型建立得好与否,唯一的标准系是否准确地反映了客观模型,要做到这一点,就必须做好如下两项工作:

1)我们对所要处理的客观模型描述是否全面、详细;

2)我们对客观模型的分析是否到位,理解客观模型的本质,是否对客观模型进行完整的归纳;

通过客观模型的归纳和抽象,得出计算机能够处理的逻辑模型;

处理逻辑模型的数据

在软件开发设计中,这一项工作是否做得好,最直接的标准是:逻辑对象的数据处理起来是否方便;

逻辑模式建立起来了,需要确定如何组织、表达逻辑模型中的数据,在软件设计中,就涉及到我们所熟悉的数据词典、对象定义、数据库结构,并且包括数组结构、数据集合、属性和公用变量等;

处理逻辑模型的数据,也涉及到一系列的相关业务算法,算法设计是否合理,是否如实地表达业务需求,并能够基于逻辑模型的数据进行运算。

逻辑模型的数据表达,在软件结构设计的不同层面中,也有相应不同的表达方式,如在数据层,通过数据库表格,表达并存储逻辑模型的数据,但在业务层,则必须通过实例化的类对象、结构、数组表达逻辑模型的数据。

总结

目前关于软件结构设计和实现的方法,大家常提及的就是:系统需求说明、系统设计说明、模块设计说明、数据库设计等,这些设计文档的表达方式每个公司、开发团队有不同的要求,并且相对于软件项目的规模,这些设计文档有所取舍,但是,软件开发,有其内在的精髓,其精髓总结起来就是:

建立逻辑模型,并处理逻辑模型中的数据。

在实际的软件开发中,记住并领悟这句话,思路会保持明朗清晰的。

 
掌握Ruby基本类型和表达式的精髓 本篇博文深入探讨了Ruby编程语言中的基础类型和表达式,包括数组、字符串、哈希和正则表达式的构建与使用。通过实例代码和详细的解释,揭示了如何利用Ruby的语法特性来简化和优化代码编写。 阅读详情

相关推荐

Unix命令行技巧与脚本编程精髓

本文探讨了Unix系统中强大的命令行工具和脚本编程技巧,从基本的文件操作到复杂的文本处理,涵盖了Unix开发的历史背景、环境变量的使用、文件系统的结构、命令行编辑技巧、函数定义与执行、模式匹配及正则表达式的应用,以及条件语句和循环控制。深入分析了各种实用的命令和概念,如使用date命令打印日期和时间、通过sort和uniq命令处理重复数据,以及利用环境变量和数组操作来优化脚本。本文旨在为读者提供一个全面且实用的Unix命令行操作和脚本编程的指南。

weixin_32999557的博客 355

软件的精髓在于设计

软件的精髓在于设计,设计是一件费脑子的事情,因为软件设计背后是权衡的动作,比如时间换空间、空间换时间、TCP还是UDP、同步还是异步、数据冗余与一致性、微服务边界如何划分、架构中的功能性逻...

春哥大魔王的博客 936

STM32 FOC电机控制:手把手教你用CubeMX配置TIM1中心对齐PWM(含代码避坑)

本文详细解析了STM32 FOC电机控制中TIM1中心对齐PWM的配置方法,涵盖CubeMX图形化设置、HAL库代码调用及常见问题排查。特别针对L6230Q驱动芯片的使能逻辑和死区时间配置提供实用指南,帮助开发者高效实现无刷电机的高性能控制。

weixin_27027459的博客 442

软件开发过程中的各种术语总结

HLD:概要设计说明书,编制的目的是说明对程序系统的设计考虑,包括程序系统的基本处理流程、程序系统的组织结构、模块划分、功能分配、接口设计、运行设计、安全设计、数据结构设计和出错处理设计等,为程序的详细设计提供基础。LLD:详细设计说明书,编制目的是说明一个软件系统各个层次中的每一个程序的设计考虑,如果一个软件系统比较简单,层次很少,本文件可以不单独编写,有关内容合并入概要设计说明书。DD:详细设计,是软件工程中软件开发的一个步骤,是对概要设计的一个细化,详细设计每个模块实现算法,所需的局部结构。

ybb_ymm的专栏 1663

Wireshark抓包分析:如何从HTTP流量中快速定位黑客攻击痕迹(附pcap文件)

本文通过Wireshark实战,详细解析了如何从HTTP流量中快速定位黑客攻击痕迹。文章提供了核心过滤策略,并重点剖析了如何识别SQL注入攻击的流量特征、揭露WebShell的隐蔽通信以及追踪攻击者在横向移动中的行为,帮助安全人员系统性地从pcap文件中还原完整攻击链。

sprite的博客 1009

无耳科技 Solon v3.0.8 发布,Java 企业级应用开发框架

Solon 是新一代,Java 企业级应用开发框架。是杭州无耳科技有限公司的“根级”开源项目(最近“杭州六小龙”很火啊,我们也是杭州的哦)。从零开始构建(No Spring、No Java-EE、No Servlet),有灵活的接口规范与开放生态。采用对商用友好的 Apache 2.0 开源协议。

向往自由的少年!(我是一个少年!!!) 1692

流行软件开发技术一句话(自己总结的常看资料,请各位高手指点)

敏捷技术:我们应考虑把注意力集中在当前重要的事上,而不是试着设计整个系统并制订一个严格的项目计划               (你的用户虽然不是编程高手,但是他绝对是一个使用软件的高手,别以为他什么都不懂,他一看你的第一步,就能告诉你下一步应该怎么办)SOA:我们力争把螺丝和螺丝口制定成为一个行业标准,使用这些接口,你可以把任何一个服务组件嵌入到我的系统中来。ajax:将桌面上的常用技

red_hope的专栏 1742

用4690张图片搞定物流仓储难题:手把手教你训练YOLOv8纸箱检测模型(附完整源码)

本文详细介绍了如何利用YOLOv8目标检测技术解决物流仓储中的纸箱识别难题。通过4690张图片构建高质量数据集,提供完整的训练教程和源码,实现98.7%的mAP@0.5准确率。文章涵盖数据采集、模型训练、调参技巧到边缘计算部署的全流程,帮助读者快速构建智能仓储检测系统。

weixin_28717939的博客 377

一句话概括当今的软件开发

web programming - search, copy and paste

加瓦的境界 641

ESP32 DMX512与RDM协议栈开发指南

DMX512-A是专业灯光控制领域广泛采用的串行通信标准,基于RS-485物理层实现确定性单向数据传输;RDM(Remote Device Management)则在其基础上扩展双向、可寻址、可配置的智能管理能力,满足现代舞台设备远程固件升级、自动发现与参数配置需求。二者共用同一总线但时序与帧结构严格隔离,对硬件定时精度、中断响应延迟及电气隔离提出极高要求。在嵌入式实践中,ESP32凭借Wi-Fi/蓝牙连接能力与丰富外设资源,成为构建低成本智能DMX节点的理想平台。esp_dmx协议栈正是面向该场景的高性能

weixin_34945060的博客 316

迫零均衡前与迫零均衡后眼图对比附Matlab代码

迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。迫零均衡(Decision Feedback Equalization,DFE)是一种常用的数字通信技术,用于抑制信号传输中的多径干扰。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。眼图是一种常用的信号质量评估工具,通过绘制接收到的信号在时域上的波形,可以直观地观察到噪声、失真和干扰等问题。

ByteSparkX的博客 459

软件工程——软件维护总结

一.软件维护 1.概念:在软件已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。 2.目的:通过必要的维护工作使得系统持久的满足用户的需要。 维护的分类  (1)改正性维护:在软件交付使用后,因开发时测试的不彻底、不完全,必然会有部分隐藏的错误遗留到运行阶段。这些隐藏下来的错误在某些特定的使用环境下就会暴露出来。为了识别和纠正软件错误、改正软件性能上的缺陷、排除实施中的误使用,...

chengtutu的博客 1万+

SSE(Server-Sent Events)完整使用示例

本篇使用Node.js 作为服务端,在浏览器客户端演示SSE的完整实例和演示。实现了一个基于 Server-Sent Events (SSE) 的实时数据推送功能。

oscar999的专栏 750

转:教育的精髓在于思辨和表达

创造力,思辨,表达

Rolei的博客 2083

【python】懂车帝字体反爬逐层解密案例(附完整代码)

懂车帝字体反爬解密,完整代码分享

景天科技苑 2万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

用一句话总结常用的机器学习算法

原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。 文章同步更新到微信公众号:SIGAICN,欢迎搜索关注获取更多干货。 其它机器学习、深度学习算法的全面系统讲解可以阅读《机器学习-原理、算法与应用》,清华大学出版社,雷明著,由SIGAI公众号作者倾力打造。 书的购买链接 书的勘误,优化,源代码资源 导言 浓缩就是精华。想要把书写...

SIGAI_优快云的博客 4107

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C语言的精髓综述

C语言,作为一种古老而又历久弥新的编程语言,自其诞生以来,便以其独特的魅力和强大的功能在编程界占据了举足轻重的地位。C语言的精髓,不仅体现在其语法结构的简洁明了上,更在于其深邃的设计理念和广泛的应用场景。以下是对C语言精髓的深入综述。

byte轻骑兵的技术小窝 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Shell编程精髓:表达式与数组实战指南

掌握Shell编程的表达式和数组操作是编写高效脚本的关键。本文将深入解析Shell中的各种表达式类型和数组操作技巧,助你提升脚本开发能力。

XYL6AAD8C的博客 895

递归的精髓————理所当然

一:何为递归         我的理解是自己调用自己,但是调用的时候把整体的规模缩小了,最后规模少到一定程度的时候就可以显然的得出答案。         例如:                &nbsp

shuoshuge的博客 363

《JavaScript 语言精髓》读书笔记

文章目录语法数字字符串语句对象 语法 数字 JavaScript 只有一个数字类型。它在内部被表示为 64 位的浮点数,没有分离出整数类型,所以 1 和 1.0 的值相同,这避免了短整型的溢出问题。 NaN 是一个数值,它表示一个不能产生正常结果的运算结果。NaN 不等于任何值,包括它自己。我们可以用 isNaN(xxx) 检测是否是 NaN。 Infinity 表示所有大于 1.7976931...

前端向朔 810

陈志武:美国通识教育的精髓在于思辨与表达

陈志武:美国通识教育的精髓在于思辨与表达 01 产业结构难转型,教育有责任 我不是研究教育的专家,但是,这些年看到国内的教育,特别是我自己从小在中国受教育,然后又去了美国,自然有许多观察和体会。 到目前为止,我这一辈子没有离开过学校。1968年在湖南茶陵县开始上小学,1979年读完高中在长沙上大学,1986年去美国读研究生,1990年毕业

liuyaozhongbjca的博客 1188

祝贺博文《软件开发高手须掌握的4大SQL精髓语句(综合篇)》三天内获得3500多次浏览...

今天感觉到非常高兴,自己撰写的博文“软件开发高手须掌握的4大SQL精髓语句”系列中的《软件开发高手须掌握的4大SQL精髓语句(综合篇)》,10月30日发布我的优快云博客上,截止到今晚,不到3天的时间,已经被浏览3500多次了,在此,本人深深感谢博友们的厚爱,希望大家能够通过交流来获得提高。 至此,自己撰写的“软件开发高手须掌握的4大SQL精髓语句...

weixin_30834019的博客 59

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓

Scrum框架,作为敏捷开发的先锋,鼓励团队自组织、持续交付,并通过迭代和反馈的循环不断适应变化。在Scrum的引领下,团队能够更好地应对项目挑战,提高工作效率,同时实现高度客户满意度。然而,我们也要认识到Scrum框架的适用范围和实施挑战。通过深入理解Scrum的精髓,我们有望在敏捷之路上航行得更为顺畅,为软件开发的未来赋予更多的活力和可能性。

AliceNo的博客 9025

捕捉Ruby正则表达式用法精髓

正则表达式作为一个强大的匹配语言已经越来越多的使用到不同的领域当中,文章将介绍Ruby正则表达式的两种常用的匹配方式,并分析了两种匹配方式的区别。 转载url:http://developer.51cto.com/art/201007/210570.htm 说起Ruby当然要提起它的正则表达式机制,正则表达式作为一个强大的匹配语言已经越来越多的使用到不同的领域当中,从字符串验证,匹配,到网

行走、思考 557

表达式查询,thinkphp的精髓

上面的查询条件仅仅是一个简单的相等判断,可以使用查询表达式支持更多的SQL查询语法,也是ThinkPHP查询语言的精髓,查询表达式的使用格式: $map['字段名'] = array('表达式','查询条件'); 表达式不分大小写,支持的查询表达式有下面几种,分别表示的含义是: 表达式 含义 协助记忆 EQ 等于(=) e

十年砍柴的博客 515

切入点表达式精髓中的精髓

expression = “execution(* com.spring.service..*.*(..)) || execution(* com.spring.dao..*.*(int,int,String))”

溺水的鱼 201
下一篇: 互联网将进入价值体现时代
teamba
博客等级 码龄20年 28粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值